メインコンテンツへスキップ
Box Mountは、Boxコンテンツを標準的なPOSIXファイルシステムとして任意のエージェント実行環境で利用できるようにします。エージェントは、使い慣れたファイル操作を使用してファイルの読み取り、書き込み、および編集を行います。すべての操作には、Boxのセキュリティ、ガバナンス、およびアクセス制御が適用されます。継続的な双方向の同期により、エージェント側のコンテンツとBox上のコンテンツは同期された状態に保たれます。そのため、組み込みの競合防止機能が有効な状態で、ユーザーとエージェントは同じフォルダ内でコラボレーションできます。
Box Mountは現在、プライベートプレビュー段階です。一般公開はされておらず、本番環境向けのSLAの対象外です。また、正式リリースまでに機能が変更される可能性があります。Boxはプレビュー参加者にバイナリと設定ガイダンスを提供しています。アクセス権限をリクエストするには、Box Mountプライベートプレビューの利用申請フォームに必要事項を入力してください。

Box Mountの仕組み

Box Mountは、バックグラウンドで同期プロセス (デーモン) を実行し、自社製品がプロビジョニングしたサンドボックス内のローカルディレクトリにBoxフォルダをマッピングします。Daytona、Docker、E2B、Vercel Sandboxなどのサポート対象Linuxサンドボックスで利用でき、特定ベンダーに依存しません。
  • コンテンツはBoxに保持されます。エージェントはローカルパスを対象に操作を実行し、すべての操作はBox APIを介して実行されます。
  • ガバナンスはコンテンツに追従します。すべての操作は、Box Mountが認証したIDとして実行されます。そのため、Box Shieldの分類ベースのセキュリティポリシーとともに、そのIDの権限、リテンション、リーガルホールド、情報バリア、監査証跡がエージェントに適用されます。OAuthモードでは、IDはアプリを承認したユーザーです。そのため、ユーザーがアクセスできないコンテンツにエージェントがアクセスすることはできません。JWTモードでは、IDはサービスアカウントです。そのため、そのアカウントのスコープをエージェントが必要とするコンテンツに設定します。
  • 同期は双方向で実行されます。エージェントがマウント上で行った変更はBoxにアップロードされ、ユーザーや他のエージェントによる更新はマウントに反映されます。
  • 競合は上書きされずに保持されます。ユーザーやエージェントが同じファイルを同時に変更した場合、Box Mountはアップロード時に競合を検出し、両方の結果を新しいBoxバージョンまたは別個の競合コピーとして保持します。そのため、レビュー担当者は変更内容をマージしたり、Boxのバージョン履歴を利用してロールバックしたりできます。
エージェントはコンテンツをプレーンファイルとして扱うため、ほとんどのツールではBoxコンテンツであることを意識せずに利用できます。ファイルを直接編集するのではなく、置き換えることで保存するアプリケーションは挙動が異なるため、最初に既知の制限を確認してください。

Box Mountの実際の動作を確認する

このデモでは、契約書レビューエージェントを構築します。このエージェントは、BoxフォルダをE2Bサンドボックス内にマウントし、そのワークスペース上でエージェントを実行し、完了したレビュー結果をBoxに同期して、ユーザーがレビューできるようにします。
このデモで利用しているアーキテクチャやその他のワークフローパターンについては、BoxブログのMeet Box Mount: A Box workspace for sandboxed AI agentsを参照してください。

始める前に

以下が必要です。

サポート対象プラットフォーム

Box Mountは、x86_64およびARM64アーキテクチャ上で動作するLinux実行環境をサポートしています。macOSはサポートしていません。

コマンド

最初のセッションは次のようになります。
これで、エージェントは/mnt/boxを対象に動作するようになります。

資格情報の構成

Box Mountは、--data-pathに渡したパスまたは~/.box-mount/にあるbox-config.jsonファイルからBox資格情報を読み取ります。 configコマンドは、対話形式による構成を1ステップで処理し、~/.box-mount/box-config.jsonに書き込みます。
Box Mountは、OAuthとJWTの2つの認証モードをサポートしています。デフォルトはOAuthです。求められたら、oauthまたはjwtを入力します。資格情報の保護で説明されているとおり、構成ファイルおよびその構成ファイルが参照するJWTの秘密キーJSONを制限します。

OAuthの手動構成

~/.box-mount/box-config.jsonを作成し、Boxアプリの資格情報を入力します。
OAuth構成には、OAuthがデフォルトのモードであるため、auth_typeフィールドはありません。auth_typeはJWTに切り替える場合にのみ設定します。

JWTの手動構成

JWTサービスアカウントを使用する場合、構成に必要なのは以下の2つのフィールドだけです。
jwt_config_pathには、開発者コンソールによって生成されたJSONファイルのパスを指定する必要があります。このJSONファイルを作成するには、アプリの [構成] タブを開き、[アプリの設定] セクションで [公開/秘密キーペアを生成] を選択します。JWT認証では、SDKが自動的に有効期間の短いアクセストークンを取得するため、access_tokenおよびrefresh_tokenは不要です。

環境変数の使用

資格情報の各フィールドは、JSONファイルの代わりに環境変数で指定できます。環境変数は、JSONファイルの値より優先されます。また、この方法ですべての必須フィールドを指定する場合、JSONファイルは省略可能です。
BOX_ACCESS_TOKENやBOX_REFRESH_TOKENを、.zprofileや.bashrcなどのシェル起動ファイルに保存しないでください。Box Mountはトークンを更新すると、新しい値を~/.box-mount/box-config.jsonに書き込みます。そのため、環境変数に埋め込まれたトークンのコピーは古くなり、古いトークンは次回実行時に認証エラーの原因となります。これらの環境変数は、セッションの期間中のみエクスポートするようにしてください。また、BOX_*資格情報をLLMエージェントやその他の信頼できないプロセスの実行環境に配置しないでください。資格情報の保護を参照してください。

開発者トークンの使用

開発者トークンは、開発者コンソールで生成する有効期間の短いトークンです。60分間有効で、更新できません。OAuthフロー全体を実装せずにすばやくテストする場合に便利です。 ~/.box-mount/box-config.jsonにaccess_tokenを設定し、refresh_tokenは空のままにします。
トークンは環境変数で渡すこともできます。その場合は構成ファイルは不要です。
開発者トークンは更新できないため、トークンが期限切れになるとBox Mountは同期を停止します。再開するには、開発者コンソールで新しいトークンを生成してaccess_tokenを更新するか、環境変数を再エクスポートしてください。

トークンのライフサイクル

OAuthモードの場合:
  • アクセストークンは約60分後に期限切れになり、SDKによって自動的に更新されます。
  • 更新のたびに更新トークンがローテーションされ、古い更新トークンは即座に無効になります。
  • ローテーションされたトークンは~/.box-mount/box-config.jsonに書き戻されます。
  • 更新トークンは60日間使用されないと期限切れとなります。box-mount configをもう一度実行すると、OAuthフローが繰り返されます。
JWTモードの場合:
  • SDKはJWTアサーションに署名し、それを有効期間の短いアクセストークンと交換して、そのトークンを自動的に更新します。トークンはメモリにのみ保持されるため、box-config.jsonには何も書き込まれません。
  • JWTの構成JSONと秘密キーが有効であれば、認証にユーザーの操作は必要ありません。

資格情報の保護

Box資格情報はBox APIのIDであり、そのIDの権限スコープは通常、マウントしたフォルダよりも広くなります。これは、box-config.jsonのOAuthクライアントのシークレットとトークン、BOX_*環境変数、およびディスク上のJWTの秘密キーJSONに当てはまります。それらを読み取る権限があれば、マウント内のファイルを読み取るだけでなく、そのアプリやユーザーとしてBox APIを呼び出すことができます。 box-mount mountが起動するデーモンはそれらの資格情報を必要としますが、他のプロセスと共有する必要があるのはマウントディレクトリのみです。構成、データベース、プロセスID、ログを保持する~/.box-mount/には、Box Mountを実行するアカウント以外がアクセスできないようにします。

エージェントサンドボックスでの推奨設定

LLMエージェントをBox Mountと同じマシン上で実行する場合、デーモンと同じUnixユーザーとしてエージェントを実行しないでください。以下の2つのユーザーを使用します。
  1. 2つのユーザーを作成します。ユーザーAとしてbox-mount configを実行し、~/.box-mount/がユーザーAのホームディレクトリ内に作成されるようにします。まだマウントしないでください。ブートストラップ処理によってツリー構造が生成され、先に共有権限を空のマウントディレクトリに設定する必要があるからです。
  2. 資格情報に対するアクセスを、ユーザーAのみが読み取ることができるように制限します。その後、ls -lを使用して所有権を確認します。モード644 (全ユーザーが読み取り可能) は、これらのファイルには適切ではありません。
  3. 共有グループ、setgid、およびデフォルトのPOSIX ACLを使用して、マウントディレクトリのみをユーザーBと共有します。setgidは、グループ所有権を新しいinodeにコピーします。また、デフォルトのACLはグループの書き込みアクセス権限を継承します。この設定を空のディレクトリに適用してから、マウントします。setfaclコマンドはaclパッケージに含まれています。
    ユーザーBには、ユーザーAのホームディレクトリ、--data-path、およびJWTファイルに対する読み取りアクセス権限を持たせないようにする必要があります。また、ユーザーBはマウントより上位にあるすべてのディレクトリをトラバースできる必要があるため、この例ではマウントをホームディレクトリの外に配置しています。マウントを代わりにユーザーAのホームディレクトリ内に配置しても、ホームディレクトリが750に設定されていると、マウントディレクトリ自体が2770であっても、ユーザーBはブロックされます。
  4. ユーザーBとしてエージェントを起動します。エージェントのシェル、systemdユニット、またはコンテナ仕様には、BOX_CLIENT_ID、BOX_CLIENT_SECRET、BOX_ACCESS_TOKEN、BOX_REFRESH_TOKEN、BOX_JWT_CONFIG_PATHをエクスポートしないでください。エクスポートすると、これらの値がプロセス環境から参照可能になります。これらの値は、ユーザーAのデーモンプロセスのみが保持するようにします。
  5. JWTモードでは、企業の管理者のキーペアではなく、エージェントが必要とするコンテンツにスコープが設定されたサービスアカウントを使用します。
個人用マシンで、マウントを使用するプロセスが自分だけである場合は、自分のユーザーアカウントでBox Mountを実行するのが一般的であり、$HOMEにSSHキーを保存するのと同じモデルに従います。もう一方のプロセスが信頼できないエージェントである場合、この構成は適切ではありません。
この分離は、マシン上のルート、カーネルの悪用、またはエージェントをユーザーAとして実行するケースに対する保護を提供するものではありません。また、マウント内でエージェントが実行できる操作を制限するものでもありません。ユーザーBはそのツリーに対して通常のファイルシステムアクセス権限を持っているためです。

データおよびログの場所

デフォルトでは、--data-pathは~/.box-mount/を指しており、Box Mountはそれを基準にして他のすべてのパスを導出します。 このツリーは、デーモン専用として扱ってください。資格情報の保護を参照してください。

既知の制限

アトミックセーブの非サポート

Box Mountは、アトミックセーブ (セーフライトとも呼ばれます) をサポートしていません。アトミックセーブとは、アプリケーションが、ファイルを直接編集する代わりに、一時ファイルに書き込んだ後、その一時ファイルの名前を変更して元のファイルを置き換えるファイルの保存方法です。この方法で保存されたファイルは、Boxのバージョン履歴が失われます。これは、Box Mountが置き換え後のファイルを、既存ファイルの新しいバージョンとしてではなく、新しいファイルとして同期するためです。

ワークロードの制限

プレビュー段階では、1マウントあたり最大5 GBのコンテンツおよび10,000ファイルまでの、本番環境以外のワークロードに利用してください。

関連ツール

Box Mountは、エージェントがBoxコンテンツにアクセスするための他の方法を補完するものです。エージェントがファイルを直接操作する必要がある場合はBox Mountを使用し、APIレベルまたはコマンドラインでアクセスする場合は以下のツールを使用します。
最終更新日 2026年10月1日