この記事の結論
Google Drive MCPでは、50KBを超えるPDFを置けませんでした。2026年9月6日は16枚とも失敗し、アップロードはDrive API直のスクリプト、フォルダ作成と移動はMCPに分けています。
目次9項目
- Google Drive MCPで50KB超のPDFが置けなかった原因:中身がモデルを通る
- 2026年9月6日の実測:サブエージェント2体で16枚、置けたのは0枚
- Claude CodeとGoogleドライブの役割分担:アップロードはAPI直、フォルダと移動はMCP
- Drive APIで直接アップロードするスクリプト:multipartとsupportsAllDrives
- もう1つの罠:画面からのアップロードは共有ドライブのルートに落ちる
- Google Drive MCPをClaudeで使うときの注意:認証の期限・確認・名前の付け方
- 毎月の格納の手順:名前を付けて、まとめて上げて、件数を確かめる
- まとめ
- よくある質問
【無料・メールだけ】Claude Code 2daysセミナー(第二の脳構築講座)の次回開催の案内を受け取る →
Google Drive MCPで僕の会社がつまずいたのは、50KBを超えるPDFをMCPのファイル作成で置けないことでした。中身をbase64の文字にしてAIの会話経由で渡す形で、大きいPDFは途中で欠けます。今はアップロードだけをDrive API直のスクリプトに移し、フォルダ作りと移動はMCPに残しています。
2026年9月6日、受け取った請求書のPDFを共有ドライブに格納しようとして、MCP経由の16枚が1枚も置けませんでした。同じ日の夜、スクリプトに切り替えると17枚が入り、全件でサイズが一致しています。
この記事では、50KBで止まった原因、MCPとAPIの役割分担、共有ドライブのルートに落ちるもう1つの罠を順に書きます。どこまでMCPに任せるかで迷っている方は、3番目の章の表から読めます。
Google Drive MCPで50KB超のPDFが置けなかった原因:中身がモデルを通る
原因は、MCPのファイル作成のツールに、ファイルの中身そのものを文字で渡す作りだったことです。小さなファイルなら通りますが、PDFのように重いものは渡す途中で欠けました。
僕の会社のClaude Codeでは、Googleドライブにつないだ MCP に create_file というツールが出ていました。ファイル名と置き場所に加えて、中身をbase64という文字の形に変えて渡します。
ここでいうbase64とは、画像やPDFのような文字でないデータを、英数字と記号だけの長い文字列に置き換える方式です。文字列になったPDFは、AIが読み書きする会話の中を通って MCP に届きます。
社内の記録では、50KBを超えるPDFでこの文字列が途中で切れていました。AIが使うBashの出力の上限(約125KB)に当たり、中身が欠けたと分析しています。
つまり、MCPの側に上限があるというより、ファイルの中身をAIに運ばせる経路そのものが重いのです。AIは文章を考えるのは得意でも、大きなデータを1文字も欠かさず写す役には向いていません。
Claudeの公式ヘルプでは、Googleドライブのコネクタで「どんな種類のファイルもアップロードできる」と案内されています。一方で、ファイルは会話のコンテキストに収まる必要がある、という趣旨の記載もありました。
僕は、種類は問わなくても大きさには実質の上限があると読んでいます。少なくとも僕の会社の環境では、請求書のPDF1枚でその上限を超えました。
2026年9月6日の実測:サブエージェント2体で16枚、置けたのは0枚
2026年9月6日は、受け取った請求書をドライブに格納する作業を、9月分から人の手からAIの担当に移した日でした。最初の作業で、16枚のPDFを MCP 経由で置こうとしています。
作業は、Claude Codeのサブエージェント2体に分けて任せました。結果は16枚中0枚で、1枚も正しく置けていません。社内の手順書には「50KB超のPDFは不可(2026-09-06実測)」と1行で残しています。
失敗はもう1つ重なりました。Drive APIを直接呼ぶための認証(gcloud の ADC)が、この時点で期限切れになっていたのです。記録には「refresh token expired」と書いてあります。
ADCとは、Google Cloud のコマンドラインで一度ログインしておくと、手元のプログラムがその権限でGoogleのAPIを呼べる仕組みです。スクリプトは、この認証からその都度トークンを受け取って動きます。
認証は、僕がブラウザで許可画面を開いて付け直しました。許可画面の自動操作は安全装置で止まるので、ここは人がやる決まりです。権限には、ドライブ全体を扱う範囲を付けています。
その後、Drive APIを直接呼ぶスクリプトで上げ直しました。同じ日の20時20分に、9月分の支払分のフォルダへ17枚が入り、手元とドライブのサイズは全件で一致しています。
| 方法 | 2026年9月6日の結果 | 失敗の理由 |
|---|---|---|
MCPの create_file(サブエージェント2体) | 16枚中0枚 | 50KB超のPDFで中身が欠けた |
| Drive APIを直接呼ぶスクリプト | 17枚すべて格納・サイズ一致 | なし(先に認証を付け直した) |
表で比べると、同じPDFでも通り道を変えただけで結果が分かれました。僕ならファイルの中身を送る作業は、最初からスクリプトに任せます。
Claude CodeとGoogleドライブの役割分担:アップロードはAPI直、フォルダと移動はMCP
僕の会社では、Claude CodeでGoogleドライブを扱うとき、重い操作と軽い操作で道具を分けています。中身を送るアップロードはスクリプト、名前や置き場所を変えるだけの操作は MCP です。
分け方の基準は、AIの会話の中をファイルの中身が通るかどうかです。フォルダを作る・ファイルを移すといった操作は、IDと名前のやり取りだけで済むので、MCPでも欠けません。
| 操作 | 使う道具 | 理由 |
|---|---|---|
| PDFなどのアップロード | Drive APIを直接呼ぶスクリプト | 中身がAIの会話を通らない |
| 月のフォルダを作る | MCPの create_file(フォルダの種類を指定) | 中身が無く、名前だけ渡せばよい |
| 別のフォルダへ移す | MCPの update_file(親フォルダを付け替え) | ファイルIDと行き先のIDだけで済む |
| 件数・サイズの確認 | スクリプトの一覧表示 | 共有ドライブの中身をまとめて出せる |
僕なら、ドライブの操作を1つの道具にそろえようとはしません。AIが得意な「判断して指示を出す」部分をMCPに残し、データの運搬は機械に寄せるほうが壊れにくいからです。
スクリプトを実行するのも、Claude Codeです。AIはBashからスクリプトを呼び、結果の行を読んで成功か失敗かを判断します。中身はAIを通らず、AIが見るのは結果の数行だけになります。
MCPそのものの仕組みや、ほかの接続先はMCPとは(実際につないだ11の接続先)にまとめました。この記事は、ドライブで踏んだ罠に絞っています。
Drive APIで直接アップロードするスクリプト:multipartとsupportsAllDrives
スクリプトは、Drive API の v3 にファイルの情報と中身を1回で送る形にしています。共有ドライブに置くので、共有ドライブ対応の指定を必ず付けます。
公式のガイドでは、アップロードの方式は3つあります。中身だけを送る simple、情報と中身を一緒に送る multipart、大きなファイル向けの resumable です。
| 方式(uploadType) | 公式の説明 | 僕の会社での使い方 |
|---|---|---|
| media(simple) | 5MB以下の小さなファイルを、情報なしで送る | 使っていない |
| multipart | 5MB以下の小さなファイルを、名前などの情報と一緒に送る | 請求書のPDFはこれで送っている |
| resumable | 5MBを超える大きなファイルや、通信が切れやすいとき | 今は使っていない |
請求書のPDFは、名前と置き場所のフォルダを一緒に送りたいので multipart にしました。5MBを超えるファイルを扱うなら、resumable に切り替える必要があります。
共有ドライブで大事なのは supportsAllDrives=true の指定です。公式の説明では、アプリが共有ドライブのファイルを扱えると Drive に伝える指定で、付けないと一覧に共有ドライブのファイルが出てきません。
一覧を取るときは、includeItemsFromAllDrives=true も付けます。公式では、付けないか false にすると、共有ドライブの項目は返らないと書かれています。
仕組みを短く書くと次のようになります。フォルダのIDは伏せ字にしました。
# 共有ドライブのフォルダへPDFを1枚上げる(要点だけ)
import json, os, subprocess, urllib.request, uuid
token = subprocess.run(
["gcloud", "auth", "application-default", "print-access-token"],
capture_output=True, text=True).stdout.strip()
path = "10月支払_株式会社サンプル.pdf"
meta = {"name": os.path.basename(path), "parents": ["<FOLDER_ID>"]}
data = open(path, "rb").read()
b = "----boundary" + uuid.uuid4().hex
body = (f"--{b}\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n".encode()
+ json.dumps(meta, ensure_ascii=False).encode()
+ f"\r\n--{b}\r\nContent-Type: application/pdf\r\n\r\n".encode()
+ data + f"\r\n--{b}--".encode())
url = ("https://www.googleapis.com/upload/drive/v3/files"
"?uploadType=multipart&supportsAllDrives=true&fields=id,name,size")
req = urllib.request.Request(url, data=body, method="POST")
req.add_header("Authorization", "Bearer " + token)
req.add_header("Content-Type", f"multipart/related; boundary={b}")
res = json.loads(urllib.request.urlopen(req).read())
print(res["name"], res["size"], len(data)) # ドライブ側と手元のサイズを並べる
社内で使っている版には、同じ名前のファイルが既にあれば飛ばす処理と、サイズが合わなければ警告を出す処理を足しています。同じPDFを2回上げても重複しないので、失敗したらそのまま流し直せます。
最後に出すサイズの比べ合わせを残しています。MCPでは置けたように見えて中身が欠けたので、数字で確かめられる形にしました。
もう1つの罠:画面からのアップロードは共有ドライブのルートに落ちる
2つ目の罠は、画面から自動で上げたファイルが、開いているフォルダではなく共有ドライブの一番上に置かれたことです。直し方は、後で親フォルダを付け替えるか、最初からAPIで置き場所を指定するかです。
2026年8月21日、請求書のPDF35通を画面からまとめて上げたとき、目的のフォルダを開いた状態でも一番上の階層に落ちました。
このときの取得と格納の流れはplaywright-cliとPlaywright MCPの違いに詳しく書いています。
このときは、ファイルを置いた後に MCP の update_file で親フォルダを付け替え、正しい月のフォルダへ移しました。画面で上げて、MCPで移す2段構えです。
公式のガイドでも、移動は親フォルダの指定を書き換える操作です。Drive API では files.update に addParents と removeParents を付けて、親を足したり外したりします。
公式には、1つのファイルが持てる親フォルダは1つだけ、とも書かれています。付け替えのときは新しい親を足すだけでなく、元の親を外すことまでを1回の操作で済ませるのが安全です。
9月6日からは、画面からのアップロード自体をやめました。スクリプトなら最初の送信で parents にフォルダを指定できるので、移す手間も、落ちる先を確かめる手間もなくなります。
AIに普段のChromeを操作させてファイルを渡す道具も、ドライブの画面の隠れた入力欄を掴めませんでした。
ブラウザでのファイル渡しの詰まり方はClaude in Chromeでファイルアップロードできない時にまとめています。
Google Drive MCPをClaudeで使うときの注意:認証の期限・確認・名前の付け方
注意点は3つあります。APIの認証の期限、MCPで動かした後の確認、ファイル名の型の3つです。
1つ目は認証の期限です。9月6日のように、手元のAPIの認証はいつの間にか切れます。スクリプトは、トークンが取れないとすぐに止まり、付け直しのコマンドを表示するようにしました。
付け直しは僕がブラウザで許可する作業なので、無人の時間帯には直せません。手順書には、既定の認証クライアントでドライブの権限が使えなくなった場合に、自前の認証クライアントへ切り替える手順も書いてあります。
2つ目は確認です。Claudeの公式ヘルプでは、ドライブのファイルの共有・移動・ゴミ箱への移動の前に、既定で承認を求めると書かれています。僕の会社では、移動の後にも一覧を出して、件数とサイズを目で確かめます。
3つ目はファイル名の型です。受け取った請求書は「N月支払_相手名.pdf」、発行した請求書は「宛先+敬称_件名_請求書_番号」の形に決めています。名前がそろっていれば、同じ名前を飛ばす処理がそのまま重複防止になります。
月のフォルダも、支払う月や発行した月を基準に分けています。たとえば6月に発行した請求書は6月分に入れます。
症状から引く早見表
ここまでの罠を、出た症状から引けるように並べます。どれも僕の会社で実際に出たもので、対処も今の運用そのままです。
| 出た症状 | 原因 | 僕の会社での対処 |
|---|---|---|
| MCPでPDFを置くと、欠けるか失敗する | 中身をbase64の文字でAIの会話経由で渡している | Drive API直のスクリプトで上げる |
| 画面から上げたファイルが共有ドライブの一番上にある | 画面の自動アップロードが開いているフォルダに入らなかった | MCPの update_file で親を付け替える |
| スクリプトの一覧に共有ドライブのファイルが出ない | 共有ドライブ対応の指定が無い | supportsAllDrives と includeItemsFromAllDrives を付ける |
| スクリプトが最初の認証で止まる | 手元の認証(ADC)の期限切れ | 僕がブラウザで許可して付け直す |
表の中で、いちばん気づきにくいのは1行目です。僕なら、AIが「置けました」と言っても、サイズを並べて見るまでは信じません。
発行した請求書の保管の決まりはfreee API・マネーフォワード APIで請求書自動化に書きました。
毎月の格納の手順:名前を付けて、まとめて上げて、件数を確かめる
僕の会社の格納の手順は、次の4つです。どれも、9月6日の失敗の後に「中身をAIに運ばせない」ために決めた順番です。
- 受け取ったPDFを、決まった型の名前に付け直して、月ごとの作業フォルダに集める
- 新しい月なら、MCPで「N月分」と、その中の「支払分」「請求分」のフォルダを作る
- スクリプトに置き場所のフォルダと作業フォルダを渡し、まとめて上げる(同じ名前は飛ばす)
- スクリプトの一覧表示で件数とサイズを確かめ、社内の記録に1行残す
発行した請求書は、送付が済んだものだけを同じ手順で「請求分」に入れます。送付済みになったものだけを入れる決まりです。
手順の中で、AIが判断するのは名前の付け方と、結果の行が正しいかどうかだけです。ファイルを運ぶのはスクリプトで、フォルダを作るのは MCP と、役割を最初から分けています。
まとめ
- Google Drive MCPのファイル作成は、僕の会社の環境ではPDFの中身をbase64の文字にしてAIの会話経由で渡す形で、50KBを超えるPDFは置けなかった
- 2026年9月6日の実測では、MCP経由の16枚が0枚、Drive APIを直接呼ぶスクリプトでは17枚が入り、サイズも全件一致した
- アップロードはスクリプト(multipart・
supportsAllDrives=true)、フォルダ作成と移動はMCP(親フォルダの付け替え)に分けている - ブラウザの画面から自動でアップロードすると、共有ドライブの一番上に落ちた。APIで最初から置き場所を指定すれば起きない
- 僕なら最初に、ファイルの中身を送る作業だけをスクリプトに切り出し、結果をサイズで確かめる形を作るところから始めます
よくある質問
Google Drive MCPで大きなPDFをアップロードできないのはなぜですか?
僕の会社の環境では、MCPのファイル作成がPDFの中身をbase64の文字にしてAIの会話経由で渡す形だったためです。2026年9月6日の実測では、50KBを超えるPDFは途中で欠け、16枚とも置けませんでした。大きなファイルはDrive APIを直接呼ぶスクリプトで上げています。
Claude CodeからGoogleドライブにファイルを置くには、何を使えばいいですか?
僕の会社では、フォルダを作る・ファイルを別のフォルダへ移すといった軽い操作はMCP、PDFなどの中身を送るアップロードはDrive APIを直接呼ぶPythonのスクリプトに分けています。スクリプトはClaude CodeがBashから実行します。
共有ドライブにアップロードしたファイルが、開いていたフォルダに入らないのはなぜですか?
僕の会社では、ブラウザのドライブ画面から自動でアップロードしたとき、開いているフォルダではなく共有ドライブの一番上に置かれました。今は、置き場所のフォルダを指定してAPIで上げています。画面から上げてしまったときは、MCPで親フォルダを付け替えます。
