Whiskers について
Whiskersは、DockerホストやKubernetesワークロードを管理する運用者向けのセルフホスト型コントロールプレーンです。権限設定、コードで適用されるガードレール、人間による承認、操作履歴を通じてインフラ操作を管理します。
主な機能
- 01DockerとKubernetesのワークロード管理
- 02APIキーやツールごとの権限設定
- 03ガードレールによる許可・確認・拒否
- 04重要な操作の人間による承認
- 05エージェント履歴と監査ログの記録
- 06ログ、デプロイ、CVE情報の確認
活用シーン
- 01AIエージェントのインフラ操作を制限
- 02コンテナ再起動などの重要な変更を承認
- 03複数ホストのコンテナ状態を確認
- 04エージェントによるインフラ操作を監査
MCP 対応
Whiskersは、権限とガードレールで制御されたインフラツールを外部のAIクライアントに提供する、認証付きMCPサーバーです。MCP APIキーには読み取り、書き込み、管理者、または明示的なツール一覧のスコープを設定できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/lupusmalusdeviant/whiskers:0.15.0ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/lupusmalusdeviant/whiskers:0.15.0Streamable HTTPツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細

Whiskers
人間と AI エージェントのための、統制されたインフラ運用。
Whiskers は、Docker ホストと Kubernetes ワークロード向けのセルフホスト可能なコントロールプレーンです。 オペレーターや AI エージェントに制限のない SSH アクセスを与える代わりに、権限、コードで適用されるガードレール、承認、完全な操作履歴によって管理される明示的なツールを提供します。
ホストの初期設定は一度だけ行い、その後は常時有効な秘密の SSH キーを使わず、メッシュ + mTLS 経由で運用できます。
⚠️ ベータ版。 Whiskers は活発に開発中であり、API はまだ安定していません。 信頼できるネットワーク上で実行し、セキュリティポリシーを確認してください。また、
1.0より前に破壊的変更が行われる可能性があります。
Whiskers を選ぶ理由
AI エージェントはインフラを運用できます。しかし、通常そのために SSH キーやシェルを渡す方法では、個々のタスクに必要な範囲をはるかに超える権限が与えられます。Whiskers は、その間に統制レイヤーを設けます。
- オペレーターやエージェントが実行できる操作を制限します。 API キー、ロール、明示的なツールアクセスによって利用可能な機能セットを定義し、任意のシェル実行は許可しません。
- 影響が生じる前に承認を必須にします。 コードで適用されるガードレールにより、機密性の高い操作を許可、ブロック、または一時停止し、人間の確認を求めることができます。
- 何が起きたかを正確に把握できます。 Agent History と Audit Log には、実行者、判断、対象、パラメーター(シークレットは秘匿化)、結果が記録されます。
同じコントロールプレーンで Docker、Kubernetes、ログ、デプロイ、サービス、CVE のコンテキストを扱えます。しかし、対応範囲の広さは網羅性を示すものであり、主題ではありません。主題は統制され、説明責任を果たせる運用です。位置付けの詳細はdocs/product/POSITIONING.mdをご覧ください。
ガバナンスの仕組み
flowchart LR
H[Human operator]
A[AI agent]
CP[Whiskers control plane]
AUTH[Authentication & permissions]
GR[Code-enforced guardrails]
AP[Human approval]
TOOLS[Explicit infrastructure tools]
INFRA[Docker / Kubernetes / hosts]
AUDIT[Agent history & audit log]
H --> CP
A --> CP
CP --> AUTH
AUTH --> GR
GR -->|allow| TOOLS
GR -->|confirm| AP
AP -->|approved| TOOLS
GR -->|block| AUDIT
TOOLS --> INFRA
TOOLS --> AUDIT
AP --> AUDIT
目次
- クイックスタート
- 主要なワークフロー
- 機能
- アーキテクチャとセキュリティ
- MCP サーバー
- AI エージェント
- 設定
- スクリーンショット
- ロードマップとベータ版
- プロジェクト構成
- 開発
- コントリビューション
- ライセンス
クイックスタート
マルチアーキテクチャ対応のビルド済みイメージ(amd64 / arm64)は、v0.12.0 以降、
ghcr.io/lupusmalusdeviant/whiskersに公開されています。それ以前のリリースでは、以下の ソースから の手順を使用してください。
クイック — 1 つのコマンド
# Installer: pulls the image, writes a small compose file in ./whiskers/, waits until healthy, prints the URL.
curl -fsSL https://raw.githubusercontent.com/LupusMalusDeviant/Whiskers/main/deploy/install.sh | bash
# ...or a bare docker run:
docker run -d --name whiskers -p 127.0.0.1:5100:8080 \
-v whiskers-data:/app/data -v /var/run/docker.sock:/var/run/docker.sock \
ghcr.io/lupusmalusdeviant/whiskers:latest
http://127.0.0.1:5100 を開きます。インストーラーでは --port、--bind、--data、--yes を指定できます(install.sh --help)。再実行すると、その場で更新されます(pull + up)。
標準 — Docker Compose
最新リリースから docker-compose.yml をダウンロードし(イメージはすでに固定されています)、docker compose up -d を実行します。任意の設定は、同じディレクトリにある .env に記述します。すべて任意であり、Whiskers は設定なしでも動作します(.env.example を参照)。
アプリはデフォルトで 127.0.0.1:5100(HOST_BIND / HOST_PORT)でリッスンし、バインド先を変更しない限り、パブリックにはバインドされません。
初回サインイン
初回起動時に、ブラウザー上のガイド付きセットアップウィザードで管理者アカウントを作成します。.env や設定ファイルは必要ありません。ウィザードを完了した人が管理者になるため、まず、サーバーにアクセスできる人だけが読み取れる一度限りのセットアップトークンを求められます。docker exec whiskers cat /app/data/setup-token.txt を実行してください(インストーラーにも表示されます。Helm を使用する場合は、同じパスに対して kubectl exec を実行するか、WHISKERS_SETUP_TOKEN であらかじめ設定してください)。以降は、ローカルログイン(メールアドレス + パスワード)でサインインします。パスワードを 5 回間違えるとアカウントが 15 分間ロックされ、ログイン試行はクライアントごとにレート制限されます。別の方法として、WHISKERS_ADMIN_EMAIL + WHISKERS_ADMIN_PASSWORD_FILE を使って管理者アカウントを無人で作成する方法、Google または汎用 OIDC を使用する方法(設定を参照)があります。また、信頼できるネットワークで試用する場合は、AUTH_DISABLED=true を設定できます。この場合、すべてのリクエストが管理者として扱われるため、Whiskers はプライベートネットワークからのクライアントにのみ応答します。ホスト名は IP アドレスまたは localhost とし、外部の Origin を指定しないでください(設定を参照)。
MCP クライアントを接続する
Whiskers はセルフホスト型です。ホスト型またはクラウドのエンドポイントはありません。MCP クライアントは、Settings → MCP で作成した API キーを使って、自身のインスタンスの /mcp(Streamable HTTP)に接続します。
{
"mcpServers": {
"whiskers": {
"type": "http",
"url": "http://localhost:5100/mcp",
"headers": { "Authorization": "Bearer <WHISKERS_MCP_API_KEY>" }
}
}
}
詳細、スコープ、ガードレールの動作については、MCP サーバーを参照してください。
その他のインストール方法
Nginx リバースプロキシの背後に配置する
location /whiskers/ {
proxy_pass http://127.0.0.1:5100/whiskers/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Prefix /whiskers;
proxy_read_timeout 300s;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
}
サブパスで公開する場合は、.env に PATH_BASE=/whiskers を設定します。
デプロイプロファイル(フル版と強化版)
- フル版(
docker-compose.yml、デフォルト):特権モードとホスト PID 名前空間を使用するため、Whiskers はホスト自体を管理できます(ファイアウォール/Nginx/systemd/nsenter経由のexecute_command)。また、コンテナ内の VPN も実行できます。 - 強化版(
docker-compose.hardened.yml):リモートホストのみを監視する場合に使用します。非 root、privilegedなし、ケイパビリティを削除し、動詞を制限したソケットプロキシ経由で Docker にアクセスします。ローカルホストのシェル管理を手放す代わりに、攻撃対象領域を大幅に縮小できます。
全体の比較表とトレードオフについては、docs/container-hardening.md をご覧ください。
Kubernetes(Helm)
リモート Docker フリート(および Kubernetes クラスター。ポッドはダッシュボード上でコンテナの隣に表示されます)のコントロールプレーンとして、Whiskers をクラスター上で実行します。
helm install whiskers oci://ghcr.io/lupusmalusdeviant/charts/whiskers \
--set vault.key="$(openssl rand -hex 32)"
kubectl port-forward svc/whiskers 8080:8080 # → http://localhost:8080 (setup wizard)
設計上、レプリカは単一です(Blazor Server とステートフルなループ)。非 root、読み取り専用の rootfs、PVC によるデータ保存に対応しています。すべての値、Ingress/WebSocket に関する注意事項、Postgres バリアントについては、deploy/helm/whiskers/README.md をご覧ください。代わりに Whiskers からクラスターを管理する方法については、deploy/k8s/README.md をご覧ください。
ソースから(開発用)
git clone https://github.com/LupusMalusDeviant/Whiskers.git
cd Whiskers
docker compose up -d # builds the image locally
デフォルト設定を上書きするには、.env.example を .env にコピーします。.env は Git の追跡対象外のため、シークレットがリポジトリに含まれることはありません。
中核となるワークフロー
この製品を特徴づけるフローは、監視 → 提案 → ポリシー確認 → 承認リクエスト → 実行 → 検証 → 監査です。
- コンテナ/ワークロードが異常な状態です。
- エージェントは読み取りスコープのキーを使ってステータスとログを分析します。書き込みアクセスは不要です。
- エージェントが再起動を提案します。
- 有効なガードレールが再起動ツールを確認と判定するため、まだ何も実行されません。
- Whiskers は、実行者、ツール、対象サーバー、対象ワークロード、秘匿化されたパラメーター、理由、有効期限を含む承認リクエストを作成します。
- 人間が承認します。
- Whiskers は、承認済みのアクションのみを、承認済みのパラメーターで実行します。
- その後、Whiskers はワークロードを検証します。
- エージェント履歴と監査ログに一連の流れがすべて表示され、結果、承認、履歴の間を UI から直接移動できます。
これは AI 運用の導入における標準ワークフローであり、ガバナンスの受け入れテストでもあります。
機能
Docker、Kubernetes などは、コントロールプレーンが管理するターゲットです。用途別にまとめています。
ガバナンス
- キーごとの権限 — MCP API キーには、読み取り/書き込み/管理者のスコープ、または明示的なツールリストを設定できます。
- コードで適用されるガードレール — ツールごとの許可/確認/ブロックを、プロンプト内ではなくツールの境界で評価します。「最も制限の厳しい設定が優先」されます。
- Human-in-the-loop 承認 —
Confirmツールは、認可されたユーザーがアクションとパラメーターの正確な内容を承認するまで実行を一時停止します。 - エージェント履歴 — すべてのエージェントツール呼び出しを記録します。実行者/キー、秘匿化されたパラメーター、判定、結果、所要時間、ターゲットが含まれます。
- 監査ログ — すべてのユーザーアクションを、フィルタリング可能な履歴として記録します。
運用
- コンテナー — すべてのホストのライブダッシュボード(CPU/メモリ/ヘルス)。起動/停止/再起動/削除、ログ、統計情報、ヘルスレポートを利用できます。サーバー、Compose プロジェクト、自由形式のタグでグループ化できます。
- Kubernetes — kubeconfig(ボールトに暗号化して保存)を使用して k3s/Kubernetes クラスターを追加できます。ポッドはコンテナーの横に表示され、オーナーごとのグループ化、ログ、および適切なスケーリング/ロールアウト操作を利用できます。
- ホスト管理 — ファイアウォール(ufw)、Nginx サイト、systemd サービス、SSL 証明書、統合ウェブターミナル(ホストおよびコンテナー)を管理できます。
- デプロイ — デプロイフォーム、Compose アップロード、厳選されたアプリテンプレート、レジストリー横断のイメージ検索、Git デプロイ(リポジトリを対象ホストにクローン/ビルド/構成)を利用できます。HMAC 署名付きウェブフックによるプッシュをトリガーとした再デプロイにも対応します。
セキュリティ
- CVE スキャン — OS およびコンテナーイメージ(Trivy)をスキャンし、重複を除去した検出結果ダッシュボードで深刻度と経過時間を確認できます。
- シークレットボールト — 保存時にシークレットを暗号化(AES-256-GCM)します。ログ記録および永続化の前に、機密値をマスキングします。
- 必須の HMAC ウェブフックシークレット(
X-Hub-Signature-256互換)とフェイルクローズの認可 — 明示的に認証を省略する設定がない限り、すべてのエンドポイントで認証が必要です。 - すべての SSH 接続経路でのSSH ホストキー検証(初回接続時に信頼)。
- メッシュ+mTLSによる安定運用(アーキテクチャとセキュリティを参照)。
レジリエンス
- Whiskers 自身のデータのバックアップと復元 — VAULT_KEY による暗号化(AES-256-GCM)、スケジュール設定、クラッシュセーフな遅延スワップ復元に対応します。
- イメージ更新のロールバック — 更新のたびにスナップショットを作成し、ダッシュボードからワンクリックで元に戻せます。
- 監視とアラート — CPU/RAM/ディスクの履歴メトリクス、ヘルスレポート、および通知(Mattermost、Matrix、Telegram、ntfy、Discord、Slack、Email/SMTP、汎用ウェブフック)に対応します。不健全/停止/OOM のコンテナー、再起動ループ、継続的な負荷異常、新しい CVE、利用可能なイメージ更新を通知し、アプリ内に永続的なフィードを表示します。
インテグレーション
- MCP サーバー — 外部 AI クライアント向けの認証済みインターフェースです(MCP サーバーを参照)。
- クラウド制御(帯域外) — SSH/Docker に一時的に接続できない場合でも、プロバイダー API を介してプロバイダーに依存しない電源制御/スナップショット/メトリクスを利用できます(Hetzner、Hostinger)。
- レジストリー — プライベートレジストリーの認証情報をボールトに保存し、認証が必要なイメージの取得時に自動的に使用します。
- データベース — Entity Framework Core を介して、SQLite(設定不要)または PostgreSQL を使用できます。
- UI — ライト/ダーク/システムテーマと、完全にローカライズされた英語(デフォルト)/ドイツ語のインターフェースを利用できます。
アーキテクチャとセキュリティ
Whiskers は、オンボーディング済みの各ホストを 3 つの独立したプレーンで管理します。いずれも通常運用時に SSH を使用せず、保存された SSH キーも必要ありません。
| プレーン | 内容 | トランスポート |
|---|---|---|
| テレメトリ | ホストの CPU/RAM/ディスク、コンテナーの統計情報 | node_exporter → VictoriaMetrics(メッシュ経由でプル) |
| Docker API | 一覧表示/再起動/デプロイ/検査 | mTLS(クライアント証明書、CN 固定)による Docker Engine API +動詞を許可リストで制限したソケットプロキシ |
| ホスト制御 | execute_command、systemd、journald、編集 | 同じ mTLS Docker チャネル経由で操作する、使い捨ての特権 nsenter コンテナー |
SSH はブートストラップ時のみ使用するチャネルです。 オンボーディング時には、ホストをプライベートな WireGuard メッシュ(Tailscale/NetBird)に参加させ、mTLS 証明書と Docker プロキシを展開し、テレメトリをインストールするために、ホストキーの検証(初回接続時に信頼し、その後は固定)を行ったうえで、SSH 接続を 1 回だけ確立します。ブートストラップ認証情報(アップロードしたキー、またはメモリー上のみで保持するパスワード)は、その後削除されます。それ以降、ホストは 3 つの mTLS/メッシュプレーン経由で、キーを使わずに運用されます。Whiskers はそのホスト用の常時使用 SSH キーを保持しません。(通常の SSH 接続として追加され、オンボーディングされていないサーバーは、移行されるまで SSH を使い続けます。)
これらのプレーンの実態: Docker API とホスト制御のプレーンは、管理対象ホスト上で root と同等の権限を持ちます。コンテナーの作成や nsenter の実行は、設計上 root 権限を必要とするためです。mTLS とメッシュは、その権限に 誰がアクセスできるかを制御し、スコープ、ガードレール、承認は、各呼び出し元がその権限で 何を実行できるかを制御します。設計全体、PKI(step-ca)、オンボーディングフロー、トレードオフについては docs/ARCHITECTURE.md を、脅威モデルについては SECURITY.md をご覧ください。
セキュリティの概要
- 通常運用時、管理対象ホスト用の 常時使用 SSH キーはありません。管理ポートは メッシュ内に限定されており、設計上、管理関連のものがパブリックインターネットに公開されることはありません。
- プロンプトの指示ではなく、決定論的なポリシー適用。 MCP ツール呼び出しはすべて(サインイン済みのウェブユーザー、外部 MCP クライアント、プロセス内エージェントのいずれからの呼び出しでも)、コード内の同じスコープチェック(Read/Write/Admin、またはキーごとの明示的なツールリスト)を通過します。その後、いずれも同じガードレールエンジンを通過します。これはアクション分類(Allow/Confirm/Block、保護対象リソース、禁止引数、読み取り専用キルスイッチ)と、
Confirmに対する human-in-the-loop 承認を行います。ポリシーレイヤーの適用方法をご覧ください。 - MCP API キーは、明示的なスコープを指定してウェブ UI で作成します。ServerWatch 時代のスコープ未設定キーのファイル
api-keys.jsonは、現在は存在しません(MCP サーバーのセクションをご覧ください)。 - シークレット(
.env、暗号化されたボールト、DB)は/app/data/.envに保存され、どちらも Git の追跡対象外で、ボリュームとしてマウントされます。イメージに組み込まれたり、コミットされたりすることはありません。 - リポジトリ全体のセキュリティレビューと修正(セキュリティ修正の変更履歴をご覧ください):重大および高リスクの指摘事項に加え、中リスク/低リスクの問題の大半を修正しました。エージェントと MCP を含む すべての経路でキーごとの RBAC を適用し、ボールトを AES-256-GCM + PBKDF2 で保護し、EF Core マイグレーションでスキーマを管理し、信頼性が重要なイメージをダイジェストで固定し、転送ヘッダーの信頼範囲を制限し、スクレイプトークンで保護された
/metricsを設けています。
サプライチェーン
公開されるすべてのリリースイメージは、v0.12.1 以降、次のように取り扱われます。
- 出荷前にスキャンされます — リリースパイプラインでイメージをビルドし、Trivy スキャンを実行します。CRITICAL が1件でも見つかると実行全体を失敗させるため、脆弱なイメージがプッシュされることはありません。
- 来歴情報と SBOM アテステーションを付与して、マルチアーキテクチャ対応でビルドされます(SLSA 来歴情報と SPDX SBOM をイメージに添付し、スタンドアロンの SBOM もリリースアセットとして公開します)。
- cosign(Sigstore)でキーレス署名されます — 署名はリリースワークフローの GitHub OIDC ID に紐付けられ、公開 Rekor 透明性ログに記録されます。署名鍵は誰も保持しません。
実行する前に、署名を検証してください。
cosign verify ghcr.io/lupusmalusdeviant/whiskers:0.15.0 \
--certificate-identity-regexp '^https://github.com/LupusMalusDeviant/Whiskers/.github/workflows/release.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
検証結果が有効であれば、そのイメージはこのリポジトリのリリースワークフローによってタグからビルドされたものであり、再ビルドや改ざんが行われていないことを示します。(v0.12.1 より前に公開されたイメージには来歴情報のアテステーションがありますが、cosign による署名はありません。)
セキュリティ上の問題を発見した場合は、非公開で報告してください。SECURITY.md をご覧ください。
MCP サーバー
Whiskers には統合型 MCP サーバー(Streamable HTTP、エンドポイント /mcp)が付属しており、AI エージェント(Claude Code など)がインフラストラクチャを操作できます。お使いの MCP クライアントに追加してください。
{
"mcpServers": {
"whiskers": {
"type": "http",
"url": "https://whiskers.example.com/mcp",
"headers": { "Authorization": "Bearer <WHISKERS_MCP_API_KEY>" }
}
}
}
リバースプロキシのサブパス(PATH_BASE=/whiskers)の背後に配置した場合、URL は
https://example.com/whiskers/mcp になります。ローカルインスタンスの場合は http://localhost:5100/mcp です。
API キーとスコープ
- キーは、管理者が Web UI の Settings → MCP で作成します。 各キーには Read、Write、Admin のいずれか1つのスコープが設定されるか、スコープの代わりに使用を許可するツールの明示的なリストが設定されます。 キーはいつでも無効化または削除でき、無効化されたキーは次のリクエストで拒否されます。
- すべてのツールは、コード内で最低限必要なスコープを宣言し、呼び出しのたびにチェックします。 スコープ付きキーで、そのスコープを超えるツールを呼び出すことはできません。レベルが設定されていないツールは拒否されます(フェイルクローズ)。管理者は、すべてのキーに対して個々のツールを無効にできます。
- キーはハッシュとしてのみ保存されます。 キーは暗号論的 RNG によって生成された256ビットの値です。Whiskers では作成直後に一度だけ表示され、保存されるのは SHA-256 ハッシュと識別用の末尾4文字のみです。提示されたキーはハッシュ化され、定数時間で比較されます。キーも、拒否されたトークンの一部もログには記録されません。データディレクトリやバックアップを読めたとしても、認証には使えないハッシュしか取得できません。有効なキーがないリクエストは、ツールが実行される前に拒否されます。
古いインデックス項目についての注意(ServerWatch 時代の README をクロールした MCP ディレクトリなど): v0.12 でブランド名が変更される前、Whiskers は ServerWatch という名前でした。古いスコープなしのフラットなキー ファイル
/app/data/api-keys.jsonは廃止されています。最後の互換性フォールバックは v0.15.0 で削除され、これを読み取るコードパスはなく、残っているコピーは起動時に削除されます。MCP へのアクセスには Web UI で作成したスコープ付きキーのみを使用でき、キーは平文ではなく SHA-256 ハッシュとして保存されます。
ツールの範囲:
- コンテナ:一覧表示/詳細表示/ログ/メトリクス/環境変数、起動/停止/再起動/更新
- サーバーとホスト:情報、ログ、メトリクス、ヘルスサマリー、
execute_command(Admin) - デプロイ:
deploy_app、deploy_compose - インフラストラクチャ:ファイアウォール、Nginx、systemd、SSL
- データベース:検出、一覧表示、スキーマ、クエリ、バックアップ
- ネットワーク:一覧表示/作成/削除、コンテナの接続/切断
- ログとアラート:検索、ログアラートの一覧表示/作成
- スケジューラー:スケジュール済みタスクの一覧表示/作成/削除/実行
- CVE と更新:サーバー/コンテナの CVE サマリー、更新ステータス
- クラウド(範囲外):Hetzner と Hostinger の電源操作/スナップショット/メトリクス
- エージェント:
instruct_agent(自然言語のタスクをプロセス内のエージェントに委任)
権限レベルを含む完全かつ最新の一覧は、docs/mcp-tool-catalog.md と Web UI の Settings > MCP にあります。
プロンプト(ユーザーが呼び出せるワークフロー。返すのは指示のみです。そこから実行されるすべてのツール呼び出しには、引き続きスコープとガードレールによるチェックが適用されます):
| プロンプト | 機能 |
|---|---|
triage_unhealthy_containers | 異常/停止/再起動中のコンテナを読み取り専用で診断し、修正案を優先順位付けします |
security_review_server | 1台のサーバーを読み取り専用で確認します:CVE、ファイアウォール、TLS の有効期限、予期しないサービス |
plan_safe_update | イメージ更新のリスク、影響範囲、CVE を確認し、ロールバックを含む計画を立てます。変更を加える前に停止します |
investigate_host_load | ホストの負荷について、どのコンテナにも割り当てられない負荷も含めて説明します |
リソース(MCP の機能自体に関する読み取り専用のコンテキストであり、インフラストラクチャのデータは含みません):
| URI | 内容 |
|---|---|
whiskers://tools/catalog | 提供されるすべてのツールと、それぞれに必要なレベルおよび有効かどうか |
whiskers://me/permissions | 呼び出し元自身のスコープと、呼び出し可能なツール |
ポリシーレイヤーの適用方法
Whiskers の AI ガードレールは、決定論的なポリシー適用レイヤーです(Read/Write/Admin スコープ、アクションの分類、ヒューマン・イン・ザ・ループによる承認)。プロンプトではなく、ツール境界でコードによって評価されるため、モデルの出力で回避することはできません。
| 呼び出し元 | スコープの確認(Read/Write/Admin、ツール許可リスト) | ガードレールエンジン(Allow/Confirm/Block) | 記録先 |
|---|---|---|---|
| 外部 MCP クライアントからの直接ツール呼び出し | ✅ API キーによる確認 | ✅ 毎回の呼び出しで確認します。Confirm は承認要求を発生させ、人間の承認後に同一の呼び出しを1 回だけ実行します(承認後に再試行、10 分間有効) | Agent History |
/mcp を呼び出すサインイン済みのウェブユーザー | ✅ ロールによる確認(Viewer → Read、Operator → Write、Admin → Admin) | ✅ 上記と同じ | Agent History |
プロセス内エージェント(UI または MCP instruct_agent から起動) | ✅ 起動したユーザー/キーのスコープを上限として適用 | ✅ 毎回の呼び出しで確認します。Confirm は、人間が正確なアクションとパラメーターを承認するまで実行を一時停止します | Agent History |
承認は Approvals ページで処理されます。承認するには、アクションに必要なレベル以上の権限が必要です。ガードレールエンジンはエージェントモジュールの一部であり、デフォルトで有効です。このモジュールを無効にすると、Approvals ページも表示されず、直接呼び出しはスコープのみによって制限されます。
AI エージェント(オプション)
(外部エージェントにサービスを提供する)MCP サーバーに加えて、Whiskers にはプロセス内で動作するエージェントがあります。自然言語で運用タスクを説明すると、Whiskers 独自のツールを使って計画し、実行します。複数の LLM プロバイダー(OpenAI、OpenRouter、Ollama、Gemini、Anthropic、Claude Code)に対応しており、UI で選択できます。オプションの読み取り専用アドバイザーチャットも利用できます。こちらは説明や提案のみを行い、何も実行しません。
安全性モデルはプロンプトではなく、コードによって適用されます。
- ガードレール(管理者専用の別ファイル
guardrails.json)は、決定論的なポリシー適用レイヤーです。ツール境界で評価される Allow/Confirm/Deny ルールを適用し、「最も制限の厳しいルールを優先」します。エージェントをウェブ UI から起動した場合も、MCP 経由で起動した場合も、動作は同一です。 - エージェントは起動したユーザー(ウェブユーザーまたは MCP キー)の権限を引き継ぎ、それを超える権限を得ることはできません。
- ハイブリッド自律性:読み取りは自律的に実行され、書き込み/管理者アクションには確認が必要です。
実装については、src/Whiskers/Services/Agent/ を参照してください。
設定
Whiskers は環境変数(.env)だけで設定でき、すべて省略可能です。特に重要な項目は次のとおりです。
| グループ | キー | 説明 |
|---|---|---|
| 認証 | GOOGLE_CLIENT_ID、GOOGLE_CLIENT_SECRET、GOOGLE_ADMIN_EMAIL、AUTH_DISABLED、WHISKERS_SETUP_TOKEN | AUTH_DISABLED=true にすると、すべてのリクエストが Admin として扱われます。信頼できる LAN のみでの試用を想定しています。この場合、リクエストはループバックまたはプライベートネットワークからのみ受け付けられます(範囲を絞るには Auth__DisabledAllowedNetworks__0=… を設定します)。ホスト名には IP アドレスまたは localhost を指定してください(追加するには Auth__DisabledAllowedHosts__0=whiskers.lan を設定します)。また、サイトをまたぐ Origin は許可されません。WHISKERS_SETUP_TOKEN では初回セットアップ用トークンを事前設定します。 |
| Admin の初期設定 | WHISKERS_ADMIN_EMAIL | 初回起動時に Admin として登録されます(プロバイダーに依存せず、Google の場合は GOOGLE_ADMIN_EMAIL でも同じ設定ができます)。これにより、新しいインスタンスに Admin がいない状態を防ぎます。また、いずれかのロールが存在すると、メールアドレスのホワイトリストがフェイルクローズになります。既存のインストール(roles.json があるもの)には変更を加えません。 |
| ローカルログイン | WHISKERS_ADMIN_PASSWORD_FILE、Auth__LocalLogin__Enabled | IdP を使わないユーザー名/パスワードログインです(ASP.NET Identity を使用し、同じ DB 内に専用のテーブルを作成します)。デフォルトで有効です。フェデレーション認証のみを使用するには、Auth__LocalLogin__Enabled=false を設定します。パスワードポリシー:12 文字以上。 |
| シークレット保管庫 | VAULT_KEY | 保存されたシークレットを保存時に暗号化するためのパスフレーズです(AES-256-GCM)。空の場合、保管庫は無効です。値は変更しないでください。失うと、保存されたシークレットを復号できなくなります |
| OIDC(任意) | OIDC_ENABLED、OIDC_AUTHORITY、OIDC_CLIENT_ID、OIDC_CLIENT_SECRET、... | 汎用 OpenID Connect(Authentik、Keycloak、Authelia、Zitadel など)を使って、IdP で実際の 2FA/パスキーを利用できます |
| 通知 | MATTERMOST_WEBHOOK_URL、MATTERMOST_ENABLED | Matrix は UI で設定します |
| ルーティング | PATH_BASE | リバースプロキシ経由でサブパス配下に配置する場合のパスプレフィックス |
| AI チャット | AICHAT_ENABLED、AICHAT_API_KEY、AICHAT_API_URL、AICHAT_MODEL、AICHAT_PROVIDER | 読み取り専用のアドバイザーチャット |
| エージェント | AGENT_ENABLED、AGENT_PROVIDER、AGENT_MODEL、AGENT_API_KEY、... | 動作するエージェント(上記を参照) |
| メッシュ VPN | VPN_PROVIDER、TAILSCALE_AUTHKEY、NETBIRD_SETUP_KEY、... | プラグイン可能な VPN のセットアップ(none/tailscale/netbird)。空の場合は従来どおりコンテナー内で Tailscale を使用します |
| イメージ検索 | HARBOR_URL、HARBOR_USERNAME、HARBOR_PASSWORD | セルフホスト可能な Harbor マーケットプレイスを追加します(Docker Hub と GHCR はデフォルトで有効です) |
| ホストへのバインド | HOST_BIND、HOST_PORT | コンテナーは常に内部の 8080 でリッスンします |
| データディレクトリ | WHISKERS_DATA_DIR | SQLite、JSON ストア、キー、証明書のルート(デフォルトは /app/data)。任意のボリュームまたはホストパスに変更できます |
| データベース | WHISKERS_DB_PROVIDER、WHISKERS_DB_CONNECTION、WHISKERS_DB_CONNECTION_FILE | sqlite(デフォルト、設定不要)または postgres。Postgres を使用する場合は接続文字列を設定するか、ファイルとしてマウントして _FILE にそのパスを指定します。すぐに実行できるオーバーレイ:deploy/docker-compose.postgres.yml |
コメント付きの全項目については、.env.example を参照してください。
主なランタイムの詳細
- メールアドレスのホワイトリスト:UI の Settings > Authentication で管理します。変更は再起動なしで適用されます。
- MCP API キー:UI の Settings > MCP で作成します(キーごとに Read/Write/Admin のスコープを設定できます)。新規インストール時にはキーはありません。キーは作成時に一度だけ表示され、SHA-256 ハッシュとしてのみ保存されるため、その時点でコピーしてください。旧バージョンのキーは初回起動時にハッシュに変換され、そのまま使用できます。Write/Admin は、必要とするキーにのみ付与してください。
- データの永続化:メトリクスデータベース(デフォルトの SQLite または PostgreSQL)、JSON ストア、証明書はデータディレクトリ(
WHISKERS_DATA_DIR、デフォルトは/app/data)に保存されます。イメージ内には保存されません。 - ヘルスプローブ:匿名でアクセスできる
/healthz(ライブネス)と/readyz(レディネス)のエンドポイントがあります。イメージには Docker のHEALTHCHECKが含まれており、Kubernetes ではこれらをプローブとして使用できます。(zのない/healthはアプリ内のステータスページです。)
技術スタック
| レイヤー | テクノロジー |
|---|---|
| バックエンド | C# / .NET 10 / ASP.NET Core |
| フロントエンド | Blazor Server + MudBlazor |
| Docker API | Docker.DotNet |
| データベース | SQLite(設定不要のデフォルト)または PostgreSQL(Entity Framework Core)+ JSON ファイルストア |
| 認証 | ローカルアカウント(ASP.NET Identity)、Google OAuth 2.0 または汎用 OIDC + ロールとメールアドレスの許可リスト |
| リアルタイム通信 | SignalR |
| MCP | ModelContextProtocol.AspNetCore |
| メトリクス | VictoriaMetrics(Prometheus 互換) |
スクリーンショット
以下の画面では、アクセス制御、ガバナンスの徹底、完全な説明責任というガバナンスモデルを最初から最後まで紹介します。主要なワークフロー(異常なワークロード → エージェントによる分析 → ガードレールの判断 → 承認 → 実行 → 監査証跡)のライブデモは、プロジェクトのウェブサイト whiskers.app.lupusmalus.dev でご覧いただけます。また、アプリ内ハンドブック(ヘルプ)には、すべての領域のスクリーンショットが掲載されています。
ガードレール — ガバナンスの徹底。 ツールの境界でチェックされる、コードによって強制され回避できないポリシーです(プロンプト内ではありません)。読み取り専用のキルスイッチ、確認なしで許可される最高レベル、保護対象のリソース、禁止された引数パターンを備えています。

エージェント履歴 — アクセス制御。 すべてのエージェント/MCP ツール呼び出しについて、実行者、権限レベル(読み取り/書き込み/管理者)、ガードレールの判定(許可/確認/拒否)、所要時間、結果を確認できます。

監査ログ — 完全な説明責任。 承認と実行の記録です。誰が何を承認したか、ガードレールがどのアクションをブロックしたか、そしてその結果生じた変更を確認できます。

セキュアな AI 運用 — ガバナンスを備えた導入ポイント。 クライアントを接続し、最小権限の読み取り専用キーを作成して、スターターガードレールのプリセット(監視のみ/安全な操作/承認必須)を有効にします。

ダッシュボード — 対応範囲。 Docker ホストと Kubernetes ワークロード全体のリアルタイムステータスと、ホストのライブメトリクスを表示します。ガバナンスモデルの適用対象となる画面です。

スクリーンショットは、匿名化されたデモデータセットを使用して撮影されています。スクリプト付きのデモについては docs/product/demo-script.md を、各画像の再現方法については docs/product/screenshots.md をご覧ください。
ロードマップとベータ版
ベータ版は機能が充実していますが、まだ完成していません。今後の予定/未実装の項目:
アカウントとロール
- ローカルログイン用の2FA(TOTP)とパスキー、サーバーごとのより細かなロール/チーム設定。
監視とトリガー
- 適切なトラフィック/異常検知と、専用の「異常なトラフィック」トリガー(現在は、CPU/RAM/ディスクの継続的な閾値超過と、シンプルなローリングZスコアによる外れ値検出です)。
フリートとデプロイ
- Docker イベントのリアルタイム取得(現在はポーリング)、リソース制限のインプレース編集、より充実した Compose テンプレート。
- Kubernetes トラック B.3:Pod の exec ターミナル、Pod 用 MCP ツール、metrics-server の統計(k3s クラスターの管理と、Helm を介した Kubernetes 上での実行は 0.12 でリリース済み)。
エージェントガバナンス(リリース済みの Agent-History、承認/人間参加型プロセス、リッチチャットウィジェットを基盤とします)
- 承認対象を 外部/直接の MCP 呼び出しにも拡大します。現在、人間参加型のゲートが対象とするのはプロセス内のエージェントです。直接の
tools/callリクエストは記録されますが、承認のために保留されません。 - 承認カードにツールごとの実際の 差分を表示します(書き込みによって何が変わるかを正確に示します)。
- 厳選したチャートとステータスカードに加え、より充実した リッチウィジェット/MCP-Apps カタログを用意します。
堅牢化と回復性
- ブレークグラス/災害復旧:通常のコントロールプレーンが利用できない場合に、監査可能な緊急アクセス経路として step-ca 経由で短期間有効な SSH 証明書を発行します。
- 堅牢化プロファイル向けの Distroless/chiseled「リモート」イメージ(ロックダウンされたコンテナープロファイルと、プラグイン可能な Tailscale/NetBird VPN はすでにリリース済みです。詳細は docs/container-hardening.md をご覧ください)。
ご要望があれば、issue を作成してください。
プロジェクト構成
各ソースフォルダーには、その中のファイルを説明する README.md があります。概要は以下のとおりです。
Whiskers/
├── src/
│ ├── Whiskers/ # the application
│ │ ├── Components/ # Blazor UI (Pages, Layout, Shared)
│ │ ├── Configuration/ # strongly-typed settings classes
│ │ ├── Hubs/ # SignalR hubs (container + terminal streams)
│ │ ├── Mcp/ # MCP server tools + permission layer
│ │ ├── Models/ # data models (Agent, Cloud, Cve, Hetzner, Hostinger)
│ │ ├── Services/ # all business logic (see Services/README.md)
│ │ ├── Utils/ # small helpers (secret redaction, shell quoting)
│ │ ├── wwwroot/ # static assets
│ │ └── Program.cs # composition root (DI, middleware, MCP, auth)
│ └── Whiskers.Tests/ # xUnit test suite
├── deploy/telemetry/ # mesh/mTLS deploy templates (node_exporter, VictoriaMetrics, Tailscale ACL)
├── docs/ARCHITECTURE.md # architecture, security-critical areas & change control
├── docs/product/ # product positioning (see docs/product/POSITIONING.md)
├── Dockerfile
├── docker-compose.yml
└── README.md
Services/ ツリーはアプリの中核です。詳しくは、ガイド付きの説明がある src/Whiskers/Services/README.md をご覧ください。
コード規約
- インターフェース優先:サービスは
IFooインターフェースを通じて定義し、DI に登録します。利用側はインターフェースに依存します。 - コード内コメントと XML ドキュメントはすべて 英語で記述します。ユーザー向け UI はローカライズされています(デフォルトは英語、ドイツ語も利用できます)。
開発
必要要件:.NET 10 SDK。
# build
dotnet build src/Whiskers/Whiskers.csproj
# run tests
dotnet test src/Whiskers.Tests/Whiskers.Tests.csproj
# run locally (listens on :8080)
dotnet run --project src/Whiskers/Whiskers.csproj
コントリビューション
issue とプルリクエストを歓迎します。以下をお願いします。
- インターフェース優先の方針を守り、
src/Whiskers.Tests/にテストを追加/拡張してください。 - PR を作成する前に、
dotnet build(警告 0 件)とdotnet testを実行してください。 - コード内コメントとドキュメントは英語で記述してください。
ライセンス
Apache License 2.0。詳細は LICENSE をご覧ください。
Copyright © 2026 Whiskers Contributors
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。