概要
rdc mcp serve コマンドは、AIエージェントがインフラストラクチャを管理するために使用できるローカルMCP(Model Context Protocol)サーバーを起動します。サーバーはstdioトランスポートを使用し、AIエージェントがサブプロセスとして起動してJSON-RPCで通信します。
前提条件: rdc がインストールされ、少なくとも1台のマシンが設定されていること。
Claude Code
プロジェクトの .mcp.json に以下を追加します:
{
"mcpServers": {
"rdc": {
"command": "rdc",
"args": ["mcp", "serve"]
}
}
}
名前付きコンフィグを使用する場合:
{
"mcpServers": {
"rdc": {
"command": "rdc",
"args": ["mcp", "serve", "--config", "production"]
}
}
}
Cursor
設定 → MCP Servers → サーバーを追加:
- Name:
rdc - Command:
rdc mcp serve - Transport: stdio
利用可能なツール
読み取りツール(安全、副作用なし)
| Tool | 説明 |
|---|---|
machine_query | マシンのシステム情報、コンテナ、サービス、リソース使用状況を取得 |
machine_containers | ステータス、ヘルス、リソース使用状況、ラベル、自動ルートドメインを含むDockerコンテナの一覧 |
machine_services | Rediaccが管理するsystemdサービスの一覧(名前、状態、サブ状態、再起動回数、メモリ、所有リポジトリ) |
machine_repos | デプロイ済みリポジトリの一覧(名前、GUID、サイズ、マウント状態、Docker状態、コンテナ数、ディスク使用量、更新日時、Rediaccfileの有無) |
machine_health | マシンのヘルスチェックを実行(システム、コンテナ、サービス、ストレージ) |
machine_list | 設定済みマシンの一覧 |
config_repositories | 名前からGUIDへのマッピングを含む設定済みリポジトリの一覧 |
config_show_infra | マシンのインフラ設定を表示(ベースドメイン、パブリックIP、TLS、Cloudflareゾーン) |
config_providers | マシンプロビジョニング用に設定されたクラウドプロバイダーの一覧 |
agent_capabilities | 利用可能なすべての rdc CLIコマンドとその引数・オプションの一覧 |
repo_secret_list | リポジトリのシークレット名と配信モードの一覧(値もダイジェストも返さない)。読み取り安全。 |
repo_secret_get | シークレットのSHA-256ダイジェストと配信モードを取得。平文の値は設計上返されない。シークレットの存在確認やローテーションの検証に使用。 |
書き込みツール(破壊的操作)
| Tool | 説明 |
|---|---|
repo_create | マシン上に新しい暗号化リポジトリを作成 |
repo_up | リポジトリをデプロイ/更新(Rediaccfile up を実行し、コンテナを起動)。初回デプロイまたはpull後は mount を使用 |
repo_down | リポジトリのコンテナを停止。デフォルトではアンマウントしない。LUKSコンテナも閉じる場合は unmount を使用 |
repo_delete | リポジトリを削除(コンテナ、ボリューム、暗号化イメージを破棄)。認証情報は復旧のためアーカイブ |
repo_fork | 新しいGUIDとnetworkIdを持つCoWフォークを作成(完全独立したコピー、オンラインフォーキング対応) |
backup_push | リポジトリのバックアップをストレージまたは別のマシンにプッシュ(同一GUID — バックアップ/マイグレーション、フォークではない) |
backup_pull | ストレージまたはマシンからリポジトリのバックアップをプル。プル後は repo_up(mount=true)でデプロイ |
machine_provision | OpenTofuを使用してクラウドプロバイダーに新しいマシンをプロビジョニング |
machine_deprovision | クラウドでプロビジョニングされたマシンを破棄し、コンフィグから削除 |
config_add_provider | マシンプロビジョニング用のクラウドプロバイダー設定を追加 |
config_remove_provider | クラウドプロバイダー設定を削除 |
term_exec | SSH経由でリモートマシン上のコマンドを実行 |
ワークフロー例
マシンの状態を確認:
「本番マシンの状態はどうなっていますか?」
エージェントが machine_query を呼び出し、システム情報、実行中のコンテナ、サービス、リソース使用状況を返します。
アプリケーションをデプロイ:
「ステージングマシンにgitlabをデプロイして」
エージェントが repo_up を name: "gitlab" と machine: "staging" で呼び出し、リポジトリをデプロイして成功/失敗を返します。
障害のあるサービスをデバッグ:
「nextcloudが遅いので、原因を調べて」
エージェントが machine_health → machine_containers → term_exec でログを確認し、問題を特定して修正案を提示します。
設定オプション
| Option | Default | 説明 |
|---|---|---|
--config <name> | (デフォルトコンフィグ) | すべてのコマンドで使用する名前付きコンフィグ |
--timeout <ms> | 120000 | デフォルトのコマンドタイムアウト(ミリ秒) |
セキュリティ
MCPサーバーは2段階の保護を適用します。
フォーク限定モード(デフォルト)
デフォルトでは、サーバーはフォーク限定モードで動作します。書き込みツール(repo_up、repo_down、repo_delete、backup_push、backup_pull、term_exec)はフォークリポジトリにのみ操作できます。エージェントはグランド(元の)リポジトリに触れることができません。これは設計上の制約です。
リポジトリごとのシークレットは設計上CLIのみで管理します。
repo_secret_setとrepo_secret_unsetは意図的にMCPツールとして公開していません。書き込みには--current <前回の値>という事前条件(または未検証ローテーションを承認する--rotate-secret)が必要であり、この手順は人間が確認する必要があります。シークレットのローテーションを提案するエージェントは、repo_secret_getでダイジェストを確認したうえで、JSONエラーエンベロープのnext.options[].runフィールドを通じてオペレーター向けのCLIコマンドをユーザーに伝えてください。完全なパターンについては AIエージェントの安全性、ユーザー向けの手順については リポジトリ § シークレット を参照してください。
エージェントがグランドリポジトリを変更できるようにするには、MCPサーバーをホストするエージェント起動前にターミナルで REDIACC_ALLOW_GRAND_REPO をエクスポートします:
export REDIACC_ALLOW_GRAND_REPO='gitlab' # 単一のリポジトリ
# または 'repo1,repo2,repo3'(エントリ周辺の空白は無視される)、またはすべてのリポジトリに対する '*'
claude # または cursor、gemini など
オーバーライドはプロセス祖先に対して検証されます。つまり、オーバーライドはエージェント起動時にすでにそのプロセスの環境に存在している必要があります。あなたがエージェント(およびそれがスポーンしたMCPサーバー)起動前にエクスポートしたことを意味します。エージェントがセッション途中に変数を設定することで自分自身にアクセス権を付与することはできません。意図的にMCPサーバーの引数にフラグがないのはこのためです。MCPサーバー引数のフラグはそれをそこに配置した人を証明しませんが、祖先チェックはそれを証明します。マシンレベルのアクセス(リポジトリなしの term connect -m <machine> など)には引き続き * が必要です。リポジトリ名のリストはマシンレベルのアクセスを解除しません。
リポジトリごとのSSH鍵とサーバーサイドサンドボックス
各リポジトリは独自のSSH鍵ペアを持ちます。公開鍵は command= プレフィックス付きで authorized_keys にデプロイされ、すべてのSSHセッションを renet sandbox-gateway <repo-name> 経由に強制します。これはサーバーサイドのForceCommandであり、VS Codeを含むいかなるクライアントも回避できません。
動作の仕組み:
rdc repo createまたはrdc repo forkがリポジトリごとに一意のed25519鍵ペアを生成- 公開鍵が
command="renet sandbox-gateway <name>"付きでリモートにデプロイ - その鍵を使用するすべてのSSH接続がゲートウェイを経由し、以下が適用される:
- Landlock LSM: リポジトリのマウントパスへのカーネルレベルのファイルシステム制限
- OverlayFS ホームオーバーレイ:
$HOMEへの書き込みはリポジトリごとにキャプチャされ、読み取りは実際のホームにフォールスルー - リポジトリごとのTMPDIR:
<datastore>/.interim/sandbox/<name>/tmp/ - Dockerアクセス: リポジトリの隔離されたDockerソケット経由
- 権限の降格: 共通ユーザー(
rediacc)への移行
- リポジトリの
.envrcがDockerと環境セットアップのために自動的に読み込まれる
RW許可: リポジトリのマウントパス、リポジトリごとのサンドボックスワークスペース、ホームディレクトリ(オーバーレイ経由)、Dockerソケット
RO許可: システムパス(/usr、/bin、/etc、/proc、/sys)
ブロック: 他のリポジトリのマウントパス、許可リスト外のシステムファイル
VS Code統合: 各リポジトリは <datastore>/.interim/sandbox/<name>/.vscode-server/ に独自のVS Codeサーバーインストールを持ちます。複数のリポジトリを独立したサンドボックス環境で同時に開くことができ、リポジトリ間でサーバーは共有されません。
ラテラルムーブメントを防止します。エージェントがフォークへのシェルアクセスを取得した場合でも、同じマシン上の他のリポジトリを読み取ったり変更したりすることはできません。マシンレベルのSSH(リポジトリなし)はチーム鍵を使用し、サンドボックス化されません。
アーキテクチャ
MCPサーバーはステートレスです。各ツール呼び出しは --output json --yes --quiet フラグを付けて rdc を独立した子プロセスとして起動します。これにより:
- ツール呼び出し間で状態が漏洩しない
- 既存の
rdc設定とSSH鍵を使用 - 1つのコマンドのエラーが他に影響しない