freeeの「自動で経理」に残っている未処理取引と、Gmailに届いている領収書PDFを自動でマッチングして添付するツール。
日付×金額による高精度マッチング。freeeユーザーの面倒な領収書管理を自動化します。
- 日付×金額による高精度マッチング: 取引先名の表記揺れに左右されない確実なマッチング
- LLM活用: Claude Vision APIで領収書PDFから情報を自動抽出
- 外貨対応: USD建ての請求書も市場レートでJPY換算して照合
- 高速処理: 並列OCR処理とキャッシュにより高速化(36個のPDFを約1分で処理)
- 複数PDF対応: 1件のメールに多数のPDFが添付されていても自動で全て処理
- データ保持: 取引先情報、税区分、勘定科目などを完全に保持
- シンプル:
uv run python run.py一発で動作 - 安全:
--dry-runモードでプレビュー可能
- Python 3.9以上
- poppler(PDF処理用)
- macOS:
brew install poppler - Ubuntu:
sudo apt-get install poppler-utils
- macOS:
# リポジトリクローン
git clone https://github.com/yourusername/freee-receipt-matcher.git
cd freee-receipt-matcher
# uvのインストール(未インストールの場合)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 依存関係は自動的にインストールされます機密情報はすべて credentials/ ディレクトリに集約する設計です。
- freee Developer Console でアクセストークンを発行
credentials/freee.yamlを作成:
cd credentials
cp freee.yaml.example freee.yaml
# 編集して access_token と company_id を設定- Google Cloud Console でOAuth 2.0クライアントIDを作成
credentials.jsonをダウンロードcredentials/gmail_credentials.jsonに配置
- Anthropic Console でAPIキーを取得
credentials/claude_api_key.txtに保存:
echo "sk-ant-xxxxx" > credentials/claude_api_key.txtcp config.yaml.example config.yamlデフォルト設定で動作しますが、必要に応じて調整可能:
matching:
tolerance_percent: 3.0 # 金額許容誤差(%)
date_range_days: 90 # 検索日数
min_confidence: 0.7 # 最低信頼度
logging:
level: "INFO"uv run python validate_setup.py詳細は QUICKSTART.md を参照してください。
uv run python run.pyuv run python run.py --date-from 2026-02-01 --date-to 2026-02-25uv run python run.py --dry-runuv run python run.py --config /path/to/config.yaml-
freee APIから未処理取引を取得
- 指定期間内の未処理取引を取得
-
Gmailから領収書メールを検索
- PDF添付ファイルを持つメールを検索
-
LLMで情報抽出
- Claude Vision APIで各PDFから以下を抽出:
- 取引先名
- 日付
- 金額
- 通貨
- Claude Vision APIで各PDFから以下を抽出:
-
日付×金額でマッチング
- 日付が完全一致
- 金額が許容誤差内(デフォルト±3%)
- USD建ては市場レートでJPY換算
-
freeeに添付
- マッチした領収書を対応する取引に自動添付
freee-receipt-matcher/
├── run.py # メインエントリポイント
├── validate_setup.py # セットアップ検証
├── src/
│ ├── clients/ # 外部APIクライアント
│ │ ├── freee_client.py
│ │ ├── gmail_client.py
│ │ ├── fx_rate_client.py
│ │ └── receipt_extractor.py
│ └── core/ # ビジネスロジック
│ ├── models.py # ドメインモデル
│ └── matcher.py # マッチングエンジン
├── docs/ # ドキュメント
│ ├── QUICKSTART.md
│ ├── PROJECT_STRUCTURE.md
│ └── SECURITY.md
├── scripts/ # デバッグ・テストスクリプト
├── credentials/ # 機密情報(.gitignore対象)
│ ├── freee.yaml
│ ├── claude_api_key.txt
│ └── gmail_credentials.json
├── config.yaml # 設定ファイル
└── LICENSE # MIT License
設計思想: 機密情報は credentials/ に集約、設定は config.yaml。軽量DDDアーキテクチャ。
詳細は PROJECT_STRUCTURE.md を参照。
実行ログは logs/freee-matcher.log に保存されます。
# リアルタイムでログ監視
tail -f logs/freee-matcher.log初回実行時にブラウザが開き、Googleアカウントへのアクセスを求められます。許可すると credentials/gmail_token.json が生成されます。
アクセストークンが無効です。freee Developer Consoleで新しいトークンを発行してください。
PDFライブラリがインストールされていません:
# macOS
brew install poppler
# Ubuntu
sudo apt-get install poppler-utilsexchangerate.host APIが利用できない場合、近似日付のレートで自動リトライされます。
- 大半のサービスは月1回請求 → 日付×金額がユニーク
- OpenAI/Anthropicのリチャージ → 散発的だが金額がユニーク
- 取引先名の表記揺れを回避 → freee側の登録名に依存しない
- カード会社レートと市場レートの乖離を吸収
- デフォルト±3%(設定で変更可能)
freeeの「請求書」機能から作成された取引には、APIで領収書を添付できません(freeeのAPI仕様)。 該当する取引は手動で添付してください。
freeeの「自動で経理」で同じクレジットカード明細が重複して登録されている場合があります。 これはfreee側のマスタデータの問題で、本ツールは重複を作成しません。 freee Web UIで重複取引を削除してください。
MIT License
Issue、Pull Requestを歓迎します!
- Webスクレイピング対応(認証付きサービス)
- 主要SaaSコネクタ(AWS, Azure, Slack等)
- Web UI(FastAPI + React)
pip install対応
困っている人が多い日本のfreeeユーザー向けのOSS。ぜひ使ってみてください!