メインコンテンツにスキップ ナビゲーションにスキップ フッターにスキップ

MCPサーバーのセットアップ

Model Context Protocol(MCP)サーバーを使用して、AIエージェントをRediacc基盤に接続します。

概要

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_servicesRediaccが管理する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_provisionOpenTofuを使用してクラウドプロバイダーに新しいマシンをプロビジョニング
machine_deprovisionクラウドでプロビジョニングされたマシンを破棄し、コンフィグから削除
config_add_providerマシンプロビジョニング用のクラウドプロバイダー設定を追加
config_remove_providerクラウドプロバイダー設定を削除
term_execSSH経由でリモートマシン上のコマンドを実行

ワークフロー例

マシンの状態を確認:

「本番マシンの状態はどうなっていますか?」

エージェントが machine_query を呼び出し、システム情報、実行中のコンテナ、サービス、リソース使用状況を返します。

アプリケーションをデプロイ:

「ステージングマシンにgitlabをデプロイして」

エージェントが repo_upname: "gitlab"machine: "staging" で呼び出し、リポジトリをデプロイして成功/失敗を返します。

障害のあるサービスをデバッグ:

「nextcloudが遅いので、原因を調べて」

エージェントが machine_healthmachine_containersterm_exec でログを確認し、問題を特定して修正案を提示します。

設定オプション

OptionDefault説明
--config <name>(デフォルトコンフィグ)すべてのコマンドで使用する名前付きコンフィグ
--timeout <ms>120000デフォルトのコマンドタイムアウト(ミリ秒)

セキュリティ

MCPサーバーは2段階の保護を適用します。

フォーク限定モード(デフォルト)

デフォルトでは、サーバーはフォーク限定モードで動作します。書き込みツール(repo_uprepo_downrepo_deletebackup_pushbackup_pullterm_exec)はフォークリポジトリにのみ操作できます。エージェントはグランド(元の)リポジトリに触れることができません。これは設計上の制約です。

リポジトリごとのシークレットは設計上CLIのみで管理します。 repo_secret_setrepo_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を含むいかなるクライアントも回避できません。

動作の仕組み:

  1. rdc repo create または rdc repo fork がリポジトリごとに一意のed25519鍵ペアを生成
  2. 公開鍵が command="renet sandbox-gateway <name>" 付きでリモートにデプロイ
  3. その鍵を使用するすべてのSSH接続がゲートウェイを経由し、以下が適用される:
    • Landlock LSM: リポジトリのマウントパスへのカーネルレベルのファイルシステム制限
    • OverlayFS ホームオーバーレイ: $HOME への書き込みはリポジトリごとにキャプチャされ、読み取りは実際のホームにフォールスルー
    • リポジトリごとのTMPDIR: <datastore>/.interim/sandbox/<name>/tmp/
    • Dockerアクセス: リポジトリの隔離されたDockerソケット経由
    • 権限の降格: 共通ユーザー(rediacc)への移行
  4. リポジトリの .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つのコマンドのエラーが他に影響しない