GoogleDriveFilesystem
単一の Google Drive フォルダーにファイルを保存します。各ディレクトリは設定されたルート配下の Drive フォルダーに対応し、パスには POSIX の規則(例:/notes/todo.txt)を使用します。インターフェースの詳細は、WorkspaceFilesystem インターフェースを参照してください。
インストールインストールへの直接リンク
- npm
- pnpm
- Yarn
- Bun
npm install @mastra/google-drive
pnpm add @mastra/google-drive
yarn add @mastra/google-drive
bun add @mastra/google-drive
使用方法使用方法への直接リンク
Workspace に GoogleDriveFilesystem を追加して Agent に割り当てます。
import { Agent } from '@mastra/core/agent'
import { Workspace } from '@mastra/core/workspace'
import { GoogleDriveFilesystem } from '@mastra/google-drive'
const workspace = new Workspace({
filesystem: new GoogleDriveFilesystem({
folderId: process.env.GOOGLE_DRIVE_FOLDER_ID!,
accessToken: process.env.GOOGLE_DRIVE_ACCESS_TOKEN!,
}),
})
const agent = new Agent({
id: 'drive-agent',
name: 'Drive Agent',
model: 'openai/gpt-5-mini',
workspace,
})
認証認証への直接リンク
次の認証オプションのいずれかを指定します。
accessToken:事前に取得した OAuth アクセストークン。認証済み ID と共有されたフォルダーをトークンから参照できるよう、https://www.googleapis.com/auth/driveスコープを使用します。getAccessToken:トークンを返すコールバック。外部でトークンを更新する場合に便利です。serviceAccount:Google サービスアカウント。対象フォルダーをサービスアカウントのメールアドレスと共有します。
サービスアカウントサービスアカウントへの直接リンク
バックエンド Agent にはサービスアカウント認証を推奨します。ユーザー同意フローやトークン更新処理は不要です。サービスアカウントの JSON キーファイルから必要なのは、client_email と private_key の2つの値だけです。
サービスアカウントを設定するサービスアカウントを設定するへの直接リンク
- Google Cloud Console を開き、プロジェクトを選択または作成します。
- APIs とサービス > ライブラリに移動し、Google Drive API を検索して有効にするを選択します。
- APIs とサービス > 認証情報に移動し、認証情報を作成 > サービス アカウントを選択してフォームを入力します。ロールは空欄で構いません。Drive の権限は IAM ロールではなく、フォルダーの共有によって付与されます。
- 新しいサービスアカウントを開き、キータブで鍵を追加 > 新しい鍵を作成 > JSONを選択します。ブラウザーに JSON キーファイルがダウンロードされます。
- JSON ファイルから
client_emailの値をコピーします。Drive フォルダーはこのアドレスと共有します。
Drive フォルダーをサービスアカウントと共有するDrive フォルダーをサービスアカウントと共有するへの直接リンク
サービスアカウントは独立した Google ID です。明示的に共有するまで、Drive 内の内容には一切アクセスできません。
- Google Drive で対象フォルダーを開きます。
- 共有を選択します。
- サービスアカウントの
client_emailアドレスを貼り付けます。 - 読み書きする場合は編集者、読み取り専用の場合は閲覧者にロールを設定し、送信を選択します。
- URL からフォルダー ID をコピーします。
https://drive.google.com/drive/folders/<folderId>の/folders/より後の部分です。
サービスアカウントは、通常の「マイドライブ」フォルダーにファイルを作成できません。サービスアカウントには個人用 Drive の保存容量がないため、作成するファイルは保存容量を持つ主体が所有する必要があります。個人用 Drive フォルダーを共有しただけの場合、読み取り操作は動作しますが、書き込みは容量エラーで失敗します。
書き込みアクセスには、フォルダーを共有ドライブ(旧 Team Drive)内に配置し、その共有ドライブのメンバーとしてサービスアカウントを追加します。共有ドライブは、サービスアカウントが作成するファイルに必要な保存容量を提供します。
個人用 Drive フォルダーに対する読み取り専用のワークロードには、この制限はありません。
Filesystem を設定するFilesystem を設定するへの直接リンク
JSON ファイルから client_email と private_key を環境へコピーします。
GOOGLE_DRIVE_FOLDER_ID=1AbCdEfGhIjKlMnOpQrStUvWxYz
GOOGLE_DRIVE_CLIENT_EMAIL=my-bot@my-project.iam.gserviceaccount.com
# Wrap the value in quotes — the key contains newlines that must be preserved.
GOOGLE_DRIVE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkq...\n-----END PRIVATE KEY-----\n"
import { GoogleDriveFilesystem } from '@mastra/google-drive'
const filesystem = new GoogleDriveFilesystem({
folderId: process.env.GOOGLE_DRIVE_FOLDER_ID!,
serviceAccount: {
clientEmail: process.env.GOOGLE_DRIVE_CLIENT_EMAIL!,
privateKey: process.env.GOOGLE_DRIVE_PRIVATE_KEY!,
},
})
JSON ファイル全体をコピーしたり、project_id、client_id、private_key_id、token_uri などの他のフィールドを渡したりする必要はありません。これらは使用されません。必須なのは clientEmail と privateKey だけです。privateKeyId、scopes、subject は任意です。scopes のデフォルトは ['https://www.googleapis.com/auth/drive'] で、サービスアカウントと共有されたフォルダーを参照するために必要なスコープです。より限定的な drive.file スコープでは、アプリケーション自身が作成したファイルにしかアクセスできないため、サービスアカウントと共有されたフォルダーは 404 Not Found を返します。
GoogleDriveFilesystem は署名の前に privateKey 文字列を自動的に正規化します。JSON でラップされた値のエスケープ済み引用符を含め、前後の引用符を取り除き、リテラルの \n シーケンスを実際の改行へ変換します。また、\r\n の改行コードを正規化し、末尾のカンマを削除します。.env ローダーが値をどのように処理しても、キーは機能します。
トラブルシューティングトラブルシューティングへの直接リンク
404 File not found: <folderId>:サービスアカウントにフォルダーへのアクセス権がありません。フォルダーが正確なclient_emailアドレスと共有され、フォルダー ID が URL と一致していることを確認してください。- 書き込み時の
storageQuotaExceeded:フォルダーが個人用の「マイドライブ」にあります。フォルダーを共有ドライブへ移動し、サービスアカウントをメンバーとして追加してください。 error:1E08010C:DECODER routines::unsupported:privateKeyの値が不正です。値に完全な PEM ブロックが含まれ、改行が保持されていることを確認してください(リテラルの\nでも構いません)。
読み取り専用モード読み取り専用モードへの直接リンク
書き込み操作(writeFile、appendFile、deleteFile、copyFile、moveFile、mkdir、rmdir)を禁止するには、readOnly: true を渡します。
const filesystem = new GoogleDriveFilesystem({
folderId,
accessToken,
readOnly: true,
})
コンストラクターパラメーターコンストラクターパラメーターへの直接リンク
folderId:
accessToken?:
getAccessToken?:
serviceAccount?:
id?:
readOnly?:
instructions?:
プロパティプロパティへの直接リンク
id:
name:
provider:
readOnly:
メソッドメソッドへの直接リンク
GoogleDriveFilesystem は WorkspaceFilesystem インターフェースを実装し、標準の Filesystem メソッドをすべて提供します。
readFile(path, options?)- ファイル内容をダウンロードwriteFile(path, content, options?)- ファイルをアップロードまたは上書きappendFile(path, content)- ファイルを読み取り、再アップロードして内容を追記deleteFile(path, options?)- ファイルを削除しますcopyFile(src, dest, options?)- Drive のfiles.copyAPI でファイルをコピーmoveFile(src, dest, options?)- 親を差し替えてフォルダー間でファイルを移動mkdir(path, options?)- フォルダーを作成rmdir(path, options?)- フォルダーを削除readdir(path, options?)- フォルダー内容を一覧表示(recursiveとextensionによる絞り込みに対応)stat(path)- ファイルまたはフォルダーの Drive メタデータを返すexists(path)- ファイルまたはフォルダーが存在するか確認
注意事項注意事項への直接リンク
- Google Drive では、同じフォルダー内に同名のファイルを複数配置できます。
GoogleDriveFilesystemは最初に一致した項目を選んでパスを解決するため、パスベースの検索を利用する場合は、各フォルダー内で名前を一意にしてください。 writeFileは、recursiveが未設定(デフォルト)またはtrueの場合に親フォルダーを自動作成します。親フォルダーが事前に存在することを必須にするには、recursive: falseを設定します。WriteOptionsのexpectedMtimeが適用されます。保存済みのmodifiedTimeと異なる場合、楽観的並行制御のため、書き込みはStaleFileErrorで拒否されます。- Provider は組み込みの
fetchを介して Drive REST エンドポイント(https://www.googleapis.com/drive/v3とhttps://www.googleapis.com/upload/drive/v3)のみを使用します。追加の依存関係は不要です。