はじめに — MCPでファイルを送ろうとしたら、400エラー
前回・前々回で、freee-mcpを使った確定申告の経費登録について書いてきました。
- ✅ 経費登録は8時間→30分になった
- ⚠️ トークン消費はfreeeの月額を超えそうだった
- ❌ そして今回、領収書のアップロードができないことに気づきました
実際のエラーログ
freee-mcpで領収書をアップロードしようとすると、こうなります:
ツール: mcp__freee-mcp__freee_api_post
パラメータ:
service: accounting
path: /api/1/receipts
body: {"company_id": 1568817, "description": "電気代7月分"}
レスポンス:
APIリクエストエラー: API request failed: 400
エラー詳細:
Content-Type は"multipart/form-data" しか指定できません。

MCPから領収書エンドポイントを叩いた結果。Content-Typeの不一致で400エラー。
400 Bad Request。 freee APIの /api/1/receipts エンドポイントは multipart/form-data でのファイル送信が必須です。しかしfreee-mcpの freee_api_post は Content-Type: application/json 固定です。
つまり、MCPでは領収書のアップロードが構造的に不可能です。
さすがに今の時代、領収書なしで確定申告を完結させるのは現実的ではありません。これは致命的な制約です。
これはfreee-mcp固有の問題ではない
ここが重要なポイントです。これはMCPプロトコル自体の制約です。
MCPプロトコルの現在の仕様では、ツールの入出力はJSON形式のテキストデータのみ。バイナリファイルの転送メカニズムが仕様として存在しません。
MCP公式での議論
- Discussion #1197 — 「クライアントからサーバーへのファイル転送方法が未定義」という議論
- SEP-1306 — 「Binary Mode Elicitation for File Uploads」が提案されていますが、2026年3月時点で未実装です
つまり、freee-mcpの開発者がどう頑張っても、MCPプロトコル自体がファイル転送をサポートしていない以上、対応のしようがありません。
MCPの「できること・できないこと」
MCPは「AIがAPIを呼べる」という革命的なプロトコルです。しかし、現時点では明確な制約があります。
✅ MCPでできること
- JSON形式のCRUD操作(取引登録、一覧取得、更新、削除)
- テキストベースのデータ取得
- 構造化されたパラメータのやり取り
❌ MCPでできないこと
- ファイルアップロード(multipart/form-data)
- バイナリデータの送受信
- ストリーミングデータの処理
確定申告でいえば:
- 経費の金額・日付・勘定科目の登録 → ✅ MCPで完結
- 領収書画像の添付 → ❌ MCP単体では不可能
解決策: CLI Skillでcurl経由のファイルアップロード
MCPでできないなら、CLI Skillで対応します。
# OAuthトークンを取得
TOKEN=$(cat ~/.config/freee-mcp/tokens.json | jq -r '.access_token')
# 領収書アップロード + 取引登録を1コマンドで
curl -s -X POST "https://api.freee.co.jp/api/1/receipts" \
-H "Authorization: Bearer $TOKEN" \
-F "company_id=1568817" \
-F "description=電気代7月分" \
-F "issue_date=2025-07-15" \
-F "receipt=@/path/to/receipt.jpg;type=image/jpeg"
curlなら multipart/form-data が使えます。freee-mcpのOAuthトークンを再利用するので、追加の認証も不要です。
領収書付き経費登録のCLI Skill
実際に作ったSkillでは、領収書アップロードと取引登録を2ステップで行います。
ACCESS_TOKEN=$(jq -r .access_token ~/.config/freee-mcp/tokens.json)
COMPANY_ID=$(jq -r .currentCompanyId ~/.config/freee-mcp/config.json)
# Step 1: 領収書アップロード(multipart/form-data)
RECEIPT_ID=$(curl -s -X POST "https://api.freee.co.jp/api/1/receipts" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-F "company_id=$COMPANY_ID" \
-F "receipt=@/path/to/receipt.pdf" \
-F "description=電気代7月分" | jq -r '.receipt.id')
# Step 2: 取引登録(領収書を紐づけ)
curl -s -X POST "https://api.freee.co.jp/api/1/deals" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"company_id": "'$COMPANY_ID'",
"issue_date": "2025-07-15",
"type": "expense",
"details": [{
"account_item_id": YOUR_ACCOUNT_ITEM_ID,
"tax_code": 136,
"amount": 8432,
"description": "電気代7月分"
}],
"payments": [{
"date": "2025-07-15",
"from_walletable_type": "wallet",
"from_walletable_id": YOUR_WALLET_ID,
"amount": 8432
}],
"receipt_ids": ['$RECEIPT_ID']
}' "https://api.freee.co.jp/api/1/deals" \
| jq '{id: .deal.id, date: .deal.issue_date, amount: .deal.amount, receipts: (.deal.receipts | length)}'
MCPでは不可能だった領収書添付が、curlなら1コマンドで完了します。 しかもレスポンスはjqで4項目だけ返すので、トークン消費も最小限です。
MCP経由 vs CLI Skill 最終比較
| 項目 | MCP経由 | CLI Skill |
|---|---|---|
| ツール定義オーバーヘッド | 270 API分(毎ターン) | なし |
| 取引登録レスポンス | ~800文字/件 | ~80文字/件 |
| 領収書アップロード | ❌ 不可能(400エラー) | ✅ curl対応 |
| 領収書付き登録(合計) | ~960文字 + 2回呼び出し | ~100文字 + 1回呼び出し |
| 一括登録(4件) | 4回呼び出し | forループで1回 |
| レスポンス削減率 | — | 約90%減 |
| 機能カバー率 | 領収書添付不可 | 全機能対応 |
トークン消費が少ない上に、機能面でも上です。 確定申告のようにAPIの使用範囲が限定的なケースでは、CLI Skillの方が合理的です。
MCP時代に大切なこと
MCPは素晴らしい技術です。270個のAPIが一瞬で使えるようになる体験は感動的ですし、freee-mcpのおかげで確定申告が8時間→30分になったのは事実です。
しかし、「MCPがあれば何でもできる」わけではありません。
MCPの得意領域:
- 多数のAPIを横断的に使う探索的な作業
- どのAPIを使うかわからない段階での調査
- プロトタイピングや初回の動作確認
CLI Skillの得意領域:
- 使うAPIが決まっている定型作業(確定申告の経費登録など)
- ファイルアップロードが必要な処理
- トークンコストを抑えたい本番運用
最初はMCPで試して感触をつかみ、定型化したらCLI Skillに移行する。MCPとCLI Skillは対立するものではなく、段階的に使い分けるものです。
シリーズまとめ
| 記事 | 学び |
|---|---|
| ①8時間→30分 | freee-mcpで経費登録が劇的に効率化 |
| ②トークン代問題 | 270 APIツール定義で毎ターン大量消費 → CLI Skillで90%削減 |
| ③領収書が送れない(本記事) | MCPプロトコル自体にファイル転送の仕様がない → curlで解決 |
freee-mcp → 便利 → でもコスト注意 → しかもファイル送れない → CLI Skillで全部解決。
MCP時代の「できること・できないこと」を正しく理解して、適切に使い分けることが大事ですね。
最後に — freee-mcpへの感謝
この記事ではMCPの制約について書きましたが、freee-mcpには本当に感謝しています。
freee-mcpのおかげで、CLI Skillの作成も自動化できました。270個のAPIツール定義がコンテキストに載るということは、ClaudeがfreeeのAPI仕様を完全に把握できるということです。Skillのコードを書く段階では、MCPの恩恵を最大限に受けています。
そしてCLI Skillと組み合わせることで、スマホでレシートの写真や領収書のPDFを送っておくだけで、Claudeが勝手に経費登録してくれる環境が作れました。個人事業主だけでなく、少人数で経理を回している会社の経営者にとって、これは据え膳と言っていいレベルの機能です。
freee-mcpを開発されたエンジニアの方々、そしてfreeeというプロダクト自体に、深くリスペクトしています。
📘 CLAUDE.mdのセキュリティ設計やClaude Codeの実践ノウハウは、『実践Claude Code(Kindle版)』で体系的にまとめています。
📘 MCPのセキュリティ・トークンコスト・ワークアラウンドについては、『MCP実践セキュリティ(Kindle版)』で体系的にまとめています。