proxmox-lab-mcp
Proxmox home lab management MCP server that enables Claude Code to manage Proxmox VMs, Terraform, Ansible, Kubernetes, ArgoCD, and other lab utilities via HTTP/SSE.
README
proxmox-lab-mcp
Proxmox ホームラボ管理用 MCP サーバー。Raspberry Pi 5 (Ubuntu 24) 上で稼働し、Claude Code から HTTP/SSE で接続する。
構成
Claude Code (Windows)
│ HTTP/SSE http://192.168.210.55:8000/sse
▼
Raspberry Pi 5 (Ubuntu 24) ← MCP Server
├── proxmoxer → Proxmox API (LAN)
├── terraform CLI (ネイティブ実行)
├── ansible CLI (ネイティブ実行)
├── kubectl (kubeconfig)
└── ArgoCD REST API (http://argocd.homelab.local)
セットアップ(Raspberry Pi 上)
1. uv のインストール
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
2. リポジトリの配置
git clone https://github.com/fukui-yuto/proxmox-lab-mcp.git ~/proxmox-lab-mcp
cd ~/proxmox-lab-mcp
3. 環境変数の設定
cp .env.example .env
vi .env # 各サービスの接続情報を記入
必須の環境変数:
| 変数名 | 説明 |
|---|---|
PROXMOX_HOST |
Proxmox ホスト IP |
PROXMOX_USER |
Proxmox ユーザー (例: root@pam) |
PROXMOX_TOKEN_NAME |
API トークン名 |
PROXMOX_TOKEN_VALUE |
API トークン値 |
TERRAFORM_DIR |
terraform ディレクトリのパス |
ANSIBLE_DIR |
ansible ディレクトリのパス |
KUBECONFIG |
kubeconfig ファイルのパス |
ArgoCD ツールを使用する場合(任意):
| 変数名 | 説明 |
|---|---|
ARGOCD_SERVER |
ArgoCD サーバー URL (例: http://argocd.homelab.local) |
ARGOCD_TOKEN |
ArgoCD API トークン(expiresIn=0 で生成、パスワード変更で無効化されない) |
ARGOCD_USERNAME |
自動再ログイン用ユーザー名(設定すると 401 時に自動復旧) |
ARGOCD_PASSWORD |
自動再ログイン用パスワード(設定すると 401 時に自動復旧) |
ARGOCD_VERIFY_SSL |
SSL 検証 (true/false、デフォルト: false) |
自動再ログインの仕組み:
ARGOCD_TOKENが期限切れ・無効になった場合、ARGOCD_USERNAME/ARGOCD_PASSWORDが設定されていれば自動でセッションを再取得してリトライする。両方設定しておくことを推奨。
ArgoCD API トークンの取得方法:
# admin アカウントに apiKey 権限を付与(初回のみ)
kubectl -n argocd patch configmap argocd-cm \
-p '{"data": {"accounts.admin": "apiKey,login"}}'
# セッショントークンを取得してから永続 API トークンを生成
SESSION=$(curl -sk -X POST http://argocd.homelab.local/api/v1/session \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"<password>"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])")
curl -sk -X POST http://argocd.homelab.local/api/v1/account/admin/token \
-H "Authorization: Bearer $SESSION" \
-H 'Content-Type: application/json' \
-d '{"expiresIn": 0, "id": "mcp-token"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['token'])"
取得したトークンを .env の ARGOCD_TOKEN に設定し、サービスを再起動する:
# .env を編集して ARGOCD_TOKEN を更新
vi /root/proxmox-lab-mcp/.env
# MCP サービスを再起動
sudo systemctl restart proxmox-lab-mcp
また、Pi の /etc/hosts に ArgoCD のホスト名を追加しておく必要があります:
echo "192.168.210.21 argocd.homelab.local" >> /etc/hosts
4. 起動確認
uv run lab-mcp
# → http://0.0.0.0:8000/sse で起動
5. systemd サービス登録(常時起動)
sudo tee /etc/systemd/system/proxmox-lab-mcp.service > /dev/null <<EOF
[Unit]
Description=Proxmox Lab MCP Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/proxmox-lab-mcp
ExecStart=/root/.local/bin/uv run lab-mcp
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now proxmox-lab-mcp
sudo systemctl status proxmox-lab-mcp
Proxmox API トークン作成
Proxmox Web UI → Datacenter → Permissions → API Tokens で作成:
- User:
root@pam - Token ID:
mcp-token - Privilege Separation: OFF(root 権限を継承)
Claude Code への登録
claude mcp add --transport sse -s user proxmox-lab http://<pi-ip>:8000/sse
利用可能なツール
Phase 1: Proxmox 読み取り系 ✅
| ツール名 | 説明 |
|---|---|
proxmox_list_nodes |
ノード一覧・CPU/メモリ/稼働状態 |
proxmox_list_vms |
全ノードの VM/LXC 一覧 |
proxmox_get_vm_status |
特定 VM の詳細状態 |
proxmox_get_node_resources |
ノードのリソース使用量 |
proxmox_list_storage |
ストレージプール一覧・使用量 |
Proxmox 操作系 ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
proxmox_start_vm |
VM / LXC 起動 | ✗ |
proxmox_stop_vm |
VM / LXC 停止 | ✓ confirm 必須 |
proxmox_reboot_vm |
VM / LXC 再起動 | ✓ confirm 必須 |
proxmox_list_snapshots |
スナップショット一覧 | ✗ |
proxmox_create_snapshot |
スナップショット作成 | ✗ |
proxmox_rollback_snapshot |
スナップショットへロールバック | ✓ confirm 必須 |
proxmox_list_tasks |
直近タスク一覧 | ✗ |
Proxmox 調査系 ✅
| ツール名 | 説明 |
|---|---|
proxmox_get_vm_config |
VM / LXC の設定詳細(CPU / メモリ / ディスク / ネットワーク) |
proxmox_get_task_log |
タスク UPID のログ取得(list_tasks で得た UPID を指定) |
proxmox_get_cluster_status |
クラスター全体の健全性ステータス |
proxmox_list_networks |
ノードのネットワーク設定一覧 |
proxmox_get_storage_content |
ストレージ内の ISO / テンプレート一覧 |
proxmox_get_replication_status |
ZFS レプリケーションジョブの状態(node01 ↔ node02 同期確認) |
proxmox_get_backup_jobs |
vzdump バックアップタスク履歴 |
proxmox_get_certificate_info |
TLS 証明書情報と残り有効日数 |
Phase 2: Terraform tools ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
terraform_plan |
terraform plan 実行・差分表示 | ✗ |
terraform_validate |
構文検証のみ(apply なし) | ✗ |
terraform_state_list |
state 内リソース一覧 | ✗ |
terraform_state_show |
特定リソースの state 詳細 | ✗ |
terraform_output |
output 値取得 | ✗ |
terraform_apply |
terraform apply 実行 | ✓ confirm 必須 |
terraform_destroy |
terraform destroy 実行 | ✓ confirm 必須 |
Phase 3: Ansible tools ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
ansible_ping |
全ホスト疎通確認 | ✗ |
ansible_list_inventory |
インベントリ構成確認 | ✗ |
ansible_run_module |
アドホックモジュール実行(shell, setup 等) | ✗ |
ansible_get_facts |
ホストの facts 収集(OS / ハードウェア情報) | ✗ |
ansible_run_playbook |
playbook 実行 | ✓ confirm 必須 |
Phase 4: kubectl / Helm tools ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
kubectl_get |
kubectl get <resource>(label_selector / output / jq_filter 引数対応) | ✗ |
kubectl_describe |
kubectl describe <resource> <name> | ✗ |
kubectl_logs |
Pod ログ取得(--previous / container / since 引数対応) | ✗ |
kubectl_exec |
Pod 内コマンド実行(シェル調査・疎通確認等) | ✗ |
kubectl_get_events |
Namespace / Pod のイベント一覧(障害原因特定) | ✗ |
kubectl_get_secret |
Secret 内容確認(値はマスク表示) | ✗ |
kubectl_get_configmap |
ConfigMap 内容確認 | ✗ |
kubectl_run |
一時 Pod でコマンド実行(Pod は自動削除) | ✗ |
kubectl_port_forward |
ローカルへのポートフォワード(バックグラウンド実行) | ✗ |
kubectl_apply |
マニフェスト apply(ファイルパス or インライン YAML 対応) | ✓ confirm 必須 |
kubectl_delete |
リソース削除 | ✓ confirm 必須 |
kubectl_patch |
リソース部分更新(merge / strategic / json パッチ対応) | ✗ |
kubectl_annotate |
アノテーション追加・更新 | ✗ |
kubectl_rollout_status |
Deployment ロールアウト状態確認 | ✗ |
kubectl_rollout_restart |
Deployment / StatefulSet / DaemonSet のローリングリスタート | ✗ |
kubectl_wait |
リソースが指定条件になるまで待機(condition / timeout 指定可) | ✗ |
kubectl_top |
Node / Pod リソース使用量 | ✗ |
helm_list |
Helm リリース一覧 | ✗ |
helm_get_values |
リリースの values 確認 | ✗ |
helm_show_values |
チャートのデフォルト values 確認(インストール前の設定確認に有用) | ✗ |
helm_upgrade |
リリースのアップグレード/インストール | ✓ confirm 必須 |
helm_uninstall |
リリースの削除 | ✓ confirm 必須 |
Phase 5: ArgoCD tools ✅
環境変数 ARGOCD_SERVER / ARGOCD_TOKEN が必要。
| ツール名 | 説明 | 破壊的 |
|---|---|---|
argocd_list_apps |
全アプリの一覧と sync/health 状態 | ✗ |
argocd_get_app |
アプリ詳細(リソース一覧・条件付き状態) | ✗ |
argocd_sync |
アプリの sync 実行(revision / prune / dry_run 対応) | ✓ |
argocd_refresh |
hard refresh トリガー(Git から再取得) | ✗ |
argocd_app_history |
sync 履歴(いつ・どのリビジョンがデプロイされたか) | ✗ |
argocd_app_managed_resources |
管理リソース一覧(status / health / prune 状態) | ✗ |
argocd_app_diff |
リソース差分(live vs desired)— OutOfSync 原因特定 | ✗ |
argocd_app_terminate_op |
実行中オペレーションの終了(sync 詰まり解消) | ✗ |
argocd_list_out_of_sync |
OutOfSync アプリの一覧 | ✗ |
argocd_list_unhealthy |
Unhealthy アプリの一覧 | ✗ |
Longhorn / Cilium / Vault ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
longhorn_volumes |
ボリューム一覧と状態(attached / detached / faulted) | ✗ |
cilium_status |
Cilium CNI の状態(agent health / endpoint 数) | ✗ |
vault_status |
Vault の状態(sealed / unsealed / HA モード) | ✗ |
Velero (バックアップ / リストア) ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
velero_backup_list |
バックアップ一覧と状態 | ✗ |
velero_restore_list |
リストア一覧と状態 | ✗ |
velero_schedule_list |
スケジュール一覧 | ✗ |
velero_create_backup |
バックアップ作成 | ✓ confirm 必須 |
velero_create_restore |
リストア実行 | ✓ confirm 必須 |
kubectl / Helm 追加 ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
kubectl_drain |
ノードからワークロード退避(メンテナンス用) | ✓ confirm 必須 |
kubectl_cordon |
ノードをスケジュール不可にする | ✗ |
kubectl_uncordon |
ノードのスケジュール再開 | ✗ |
kubectl_scale |
レプリカ数変更 | ✗ |
helm_history |
リリースの履歴(リビジョン一覧) | ✗ |
helm_rollback |
リリースを指定リビジョンに戻す | ✓ confirm 必須 |
Proxmox 追加 ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
proxmox_migrate_vm |
VM / LXC を別ノードにマイグレーション | ✓ confirm 必須 |
Lab ユーティリティ ✅
| ツール名 | 説明 | 破壊的 |
|---|---|---|
lab_ping |
Raspberry Pi から疎通確認 | ✗ |
lab_wakeup |
Wake-on-LAN でホスト起動 | ✗ |
lab_exec |
SSH 経由で VM / ホスト上のコマンドを直接実行 | ✗ |
lab_check_port |
ポート開閉・疎通の確認 | ✗ |
lab_check_ports |
複数ポート一括確認 | ✗ |
lab_dns_lookup |
DNS 名前解決(Pi-hole 経由確認等) | ✗ |
lab_traceroute |
ネットワーク経路確認 | ✗ |
lab_curl |
HTTP リクエスト実行(ヘルスチェック等) | ✗ |
lab_journal |
SSH 経由で journalctl ログ取得 | ✗ |
lab_start_cluster |
クラスター全体の起動 | ✗ |
lab_stop_cluster |
クラスター全体の停止 | ✓ confirm 必須 |
lab_cluster_health |
ラボ全体の健全性サマリー | ✗ |
安全設計
破壊的操作には confirm: bool パラメータを必須化:
@mcp.tool()
def terraform_apply(confirm: bool = False) -> str:
if not confirm:
return "ERROR: confirm=true を明示してください"
# 実行
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.