1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

個人事業主がfreee-mcpで確定申告しようとしたら、MCPには領収書すら送れなかった話【CLI Skill付き】

1
Last updated at Posted at 2026-03-06

はじめに — 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" しか指定できません。

freee APIの400エラー
MCPから領収書エンドポイントを叩いた結果。Content-Typeの不一致で400エラー。

400 Bad Request。 freee APIの /api/1/receipts エンドポイントは multipart/form-data でのファイル送信が必須です。しかしfreee-mcpの freee_api_postContent-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版)』で体系的にまとめています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?