3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コードを1行も書かずに確定申告の経理を半自動化した(Claude Code + MCP)

3
Last updated at Posted at 2026-05-28

はじめに

個人事業主として、月末になるたびにこういう作業が発生していました。

  1. マネーフォワード クラウド会計を開いて、カード明細から仕分け登録が必要な項目を探す
  2. 勘定科目・取引先・摘要を入力して仕訳に振替
  3. 各サービスの請求書をダウンロードしてくる
    • Claudeの請求書
      • claude.ai の請求ページを開いて Stripe から PDF をダウンロード
    • Google AI Proの請求書
      • Google Pay を開いて領収書 PDF をダウンロード
    • レンタルサーバーの請求書
    • (今はやめたけど)Chat GPTの請求書
    • ...
  4. ダウンロードした PDF を添付
  5. 翌月26日ごろには「未払金 → 普通預金」の引き落とし仕訳も登録

月1回なので「まあいいか」で続けていたのですが、年次契約の レンタルサーバー やドメイン登録サービスまで加わると、サービスごとに手順が微妙に異なって地味に手間でした。

これを Claude Code で半自動化しました。今の運用はこれだけです。

/monthly              ← 月末〜翌月初に実行(請求書 DL → 仕訳登録)
/credit-payment       ← 翌月26日以降に実行(カード引き落とし仕訳)

一年分まとめて実施も可能です。

なぜ Claude Code にしたか

Claude のデスクトップアプリには Cowork モードがあり、チャットベースで同じようなことができそうでした。ただ、自分だけでなく妻のお仕事でも同じ仕組みを使い回したいと思っていたので、会話の一回性ではなく再利用できる形にしておきたかった。コードも書ける環境があるので、Skill として手順書に落としてリポジトリで管理できる Claude Code を選びました。
※よく知らないけど、自動化とか試しながら学ぼう!となっただけです。

ログインについて

ログインに関する情報は.envファイルにすら書きたくなかったので、skill実行時に、ページを開いてログインが必要であれば、ユーザーが対応してログインするようにしています。
CIで自動化して勝手にやるというスタイルではなく、ユーザーが実行するので半自動化としています。
完全自動化は求めていません。

コードは1行も書いていない

このプロジェクトのリポジトリを見ると、.py.ts も存在しません。あるのは Markdown ファイルと YAML の設定ファイルだけです。

.claude/
├── skills/
│   ├── monthly/SKILL.md
│   ├── download-anthropic/SKILL.md
│   ├── register-anthropic/SKILL.md
│   └── ...(同様に各サービス)
└── config/
    └── credit-cards.yml

Claude Code には Skill という仕組みがあり、.claude/skills/<name>/SKILL.md に「何をするか」を Markdown で書いておくと、/name で呼び出せるようになります。ブラウザの操作手順も、仕訳の登録ルールも、「Step 1: ◯◯ページを開く」と日本語で書いたものを Claude が読んで実行してくれます。

「自動化 = コードを書く」ではなく、Claude に指示書を渡す感覚で作れました。

Claude と対話しながら作った

フェーズに分けて進める

今回は、作業を 9つのフェーズに分け、1フェーズごとに「今回はこれを作りたい、どう設計しよう?」と対話しながら進めました。
最初に6フェーズまで計画を立てて、それ以降は進めながら必要に応じてフェーズを追加していきました。

Phase 内容
1 プロジェクト初期構成
2 Playwright MCP のセットアップ
3 各サービスの請求書ダウンロード Skill
4 セキュリティ対応
5 MoneyForward MCP 接続
6 仕訳登録の半自動化
7 /monthly 月次一括処理
8 クレジットカード引き落とし仕訳の自動登録
9 Skill のリファクタリング

合意した設計は PLAN.md に書き起こしてもらう

各フェーズで「こういう設計にしましょう」と合意した内容を、Claude に docs/phaseN/PLAN.md へ書き起こしてもらいます。気になる点があれば修正しますが、ほぼ書き換えていません。修正するときも「この部分をこう変えて」と指示して Claude に変更してもらう、という運用でした。

docs/
├── phase3-download-skills/
│   ├── PLAN.md     ← 設計方針・決定事項ログ(日付つき)
│   └── TASKS.md    ← 完了チェックリスト
...

PLAN.md には「なぜこうしたか」が残っています。

2026-04-20:PDF から金額を解析する方式を廃止。Anthropic と Google は USD 建てのため、
実際の支払い円額はカード明細に依存する。MF のデータ連携明細から振替する方式に変更。

こういう経緯が残っていると、次のセッションでも Claude が設計意図を把握した状態で作業を引き継げます。「先週どこまで進めたっけ」という確認も不要になりました。

Skill は「指示書」として育てていく

最初に Anthropic のダウンロード Skill を作り、そこで学んだことを SKILL.md に追記しながら他のサービスへ展開しました。

たとえば Google Pay でつまずいた部分は、Claude Code が自動で試行・探索して解決策を見つけ、その内容を SKILL.md に書き残してくれました。私はマークダウンファイルの変更すらしていません。

## 注意事項

- ダウンロードボタンは `<div role="button">` で実装されているため、
  JavaScript の .click() では反応しない。Playwright の getByRole を使うこと。
- コンテンツが iframe の中にある。操作のたびに browser_snapshot を
  再取得して新しい ref を使うこと。

こうしておくと、次のセッションで Claude が同じ失敗を繰り返しません。SKILL.md が 「過去の失敗を記憶した指示書」 として機能します。

実際に動かすとどうなるか

/monthly を実行したとき

Claude がまず処理スコープを提示します。

処理スコープ(2026年5月):
  📥 ダウンロード対象:Anthropic, Google
  📋 登録対象(確認後):Anthropic, Google

年次サービス(レンタルサーバー・ドメイン登録サービス)は今月対象外のためスキップします。

続行してよいですか?

「はい」と答えると、Claude がブラウザを操作して PDF をダウンロードし、マネーフォワードに仕訳登録する一連の作業を進めます。途中、登録前には必ず確認を挟みます。

処理計画(Anthropic / 2026年5月):
  ⏭ 2026-03-31: 登録済み(仕訳No.8, ¥3,200)
  ⏭ 2026-04-30: 登録済み(仕訳No.15, ¥3,200)
  ✅ 2026-05-31: 未登録 → 登録予定(¥3,200)

1 件を登録します。よいですか?

登録済みの月を並べて表示することで、二重登録の心配なく確認できます。「はい」と答えれば仕訳登録と PDF 添付まで完了します。

/credit-payment を実行したとき

カードごとに状態を判定して表示します。

〇〇カード(2026年4月分 / 引き落とし日: 2026-04-27):
  🚀 未登録(締め期間終了)→ 自動登録します

登録後の仕訳:
  借方: 未払金 / 〇〇カード
  貸方: 普通預金 / 〇〇銀行(個人)
  摘要: 〇〇カード 引き落とし(2026年4月分)

締め期間が終わっていれば確認なしで即登録、金額が食い違うときだけ確認を求めます。

技術的な仕組み

使ったもの

技術 役割
Claude Code Skill の実行・判断・確認
Playwright MCP ブラウザ操作(DL・MF 画面操作)
MoneyForward MCP 仕訳の取得・登録・更新

MCP の設定

.mcp.json に追記して Claude Code を再起動するだけです。

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": [
        "-y", "@playwright/mcp@latest",
        "--browser=chrome",
        "--user-data-dir=./.playwright-profile"
      ]
    },
    "moneyforward": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://beta.mcp.developers.biz.moneyforward.com/mcp/ca/v3"]
    }
  }
}

--user-data-dir=./.playwright-profile を指定することでログイン状態が保持されます。一度ブラウザで手動ログインしてしまえば、以降は Claude がセッションを引き継いで操作できます。認証情報をコードに書かずに済むのもこの仕組みのおかげです。

MoneyForward MCP は OAuth 2.0 認証で、初回だけブラウザでログインして確認コードを Claude に貼ればセットアップ完了です。

PDF 解析をやめてカード明細から振替にした理由

当初は「PDF から金額を読み取って登録」を考えていましたが、途中で方針を変えました。Anthropic も Google も請求書がドル建てなので、円での支払い金額はカードの為替レートに依存します。

代わりに 「マネーフォワードのカードデータ連携明細(円建て)を仕訳に振替」 する方式にしました。これで、仕分けの新規作成はせず、必ずデータ連携の情報を元に登録する形となりました。

「手動での登録はしない」が明確になり、登録の流れもシンプルになりました。

カード決済(USD)
  → MF がカード明細を自動取得(円換算済み)
    → 未仕訳明細として表示
      → Claude が該当明細を「仕訳に振替」
        → 勘定科目・摘要を設定・PDF 添付

PDF 解析が不要になり、円建て金額の誤りもなくなりました。

クレジットカード引き落とし仕訳の2段構え

個人事業の帳簿は課金時と引き落とし時で2回仕訳を立てます。

タイミング 借方 貸方
サービス課金時 通信費 未払金(カード)
カード引き落とし時 未払金(カード) 普通預金(銀行口座)

この2本目の仕訳(引き落とし時)が漏れがちだったため、/credit-payment として独立させました。
これで、引き落とし額が正しいが、クレジットカード利用時の未払金の仕分けの登録が足りてないとか、カードの引き落としが事業主借として、個人口座から引き落としとなる際に、自動計算すると言うことも可能になりました。

カード別の締め日・支払い日は YAML で管理しています。

credit-cards.yml(実際の設定ファイル):

credit_cards:
  - name: 〇〇カード             # 実際のカード名
    card_account: 未払金
    card_sub_account: 〇〇カード(補助科目名)  # MF での表示名
    bank_account: 普通預金
    bank_sub_account: 〇〇銀行(個人)          # 引き落とし口座名
    closing: month_end                          # 月末締め
    payment_day: 26                             # 翌月26日払い

credit-cards.example.yml(テンプレート):

credit_cards:
  - name: カード名称
    card_account: 未払金
    card_sub_account: 補助科目名(MoneyForward に登録されている名称をそのまま入力)
    bank_account: 普通預金
    bank_sub_account: 補助科目名(MoneyForward に登録されている名称をそのまま入力)
    closing: month_end    # 月末締め(毎月1日〜末日)の場合: month_end
    payment_day: 26       # 翌月何日払いか(例: 26)

  # カードが複数ある場合はエントリを追加する
  # - name: カード名称2
  #   ...

引き落とし指定日が土日祝の場合は翌営業日への繰り越しも自動で考慮します。

請求書 PDF を発行しないサービスがある

利用しているドメイン登録サービスはインボイス扱いの「請求メール」しか発行されないため、Gmail のメール印刷ビューを Playwright の page.pdf() で PDF 化しています。SKILL.md に「Gmail を開いて印刷プレビューから保存する」と書いておくだけで、Claude が手順を実行してくれました。

まとめ

「自動化 = コードを書く」ではなく、Claude に手順書(SKILL.md)を渡して実行してもらうというアプローチで、ブラウザ操作と API 呼び出しを組み合わせた自動化が実現できました。

  • フェーズに分けて対話する:長い会話より、1フェーズごとに合意を積み上げる方がブレない
  • PLAN.md に「なぜ」を残す:コードがなくても設計意図が次のセッションへ引き継がれる
  • 確認ステップを省略しない:「自動化したけど何が登録されたかわからない」を防ぐ
  • 完全自動化しない:月1回の作業には半自動・確認込みがちょうどよかった

PLAN.mdに残していたので、記事かする際にもGitのログを辿るよりも、やったことを思い出しやすかったです。

Claude との対話で作れる範囲が、思っていたより広かったですね。何かあれば指示をすれば、一つずつすぐに解決していきました。不具合があっても自己解決していきました。勝手に作られていきますね。すごい。

そして、コード書いてないしCoworkでいけたのでは?

参考

注意

PDF 添付など MCP で対応できない操作は Playwright で画面を直接操作しています。利用規約に明示的な禁止条項はありませんが、いってしまえばグレーです。今回の件に限らず利用規約は確認するようにしましょう。

第13条(禁止事項)
(6) 本サービス並びに本サービスを通じてアクセスするコンテンツサイト及び情報提供元のネットワーク又はシステム等に過度な負荷をかける行為
(8) 本サービスに接続しているシステム全般について、権限なく不正にアクセスする行為、当社の設備に蓄積された情報を不正に書換え若しくは消去する行為、その他当社に損害を与える行為

昔から言われるのは、スクレイピングでしょうか。自動化で負荷をかけるパターンがあったりします。

今回、画面操作を行なっていますが、処理としてはユーザーが操作できない速度、回数で実行することも可能になります。その結果、過度の負荷を与えることになるかもしれません。
今回の件に限らず、自動化の際には注意が必要です。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?