Tax Assistant:Claude Codeスラッシュコマンド設計
税理士業務の記帳作業をClaude Codeで効率化するためのスラッシュコマンド設計。Googleスプレッドシート + GASベースのワークフローを、Nuxt 3 + Python + SQLiteのローカルアプリ「Tax Assistant」に置き換える。
システム概要
解決したい課題
| 課題 | 現状 | 目標 |
|---|---|---|
| 同期実行で遅い | 50件のレシート変換に数分 | Python非同期処理で10秒以内 |
| 手動チェックが多い | CSV貼り付け時に目視確認 | 自動バリデーション |
| RPA的な操作 | 仕訳登録のたびにクリック | 一括処理・キーボード操作 |
| データ取得が手動 | MFから1件ずつコピペ | Chrome拡張で一括取得 |
アーキテクチャ
┌─────────────────────────────────────┐
│ Nuxt(ブラウザ) │
│ ・取引一覧・仕訳候補を表示 │
│ ・バリデーション結果の確認 │
│ ・貸借一致・残高整合性チェック │
│ ・処理の進捗をリアルタイム表示 │
│ ・操作ボタンなし(確認専用) │
└─────────────────────────────────────┘
↑ 参照(リロードで最新反映)
┌─────────────────────────────────────┐
│ SQLite DB │
└─────────────────────────────────────┘
↑ 読み書き
┌─────────────────────────────────────┐
│ Claude Code CLI │
│ ・スラッシュコマンドで操作 │
│ ・仕訳提案・承認・修正 │
│ ・全ての変更操作はここで完結 │
└─────────────────────────────────────┘
ワークフロー:
- Claude CodeがPython経由でDBにデータを書き込む
- Nuxtダッシュボードをリロードして結果を確認
- 問題があればClaude Codeに伝えて修正(入力データ or テストコード)
NuxtはSQLiteを直接読み込むため、Pythonが書き込んだデータが即座に反映される。ダッシュボードで問題を発見し、Claude Codeで修正するという分業。
仕訳候補提案の4層構造
| 層 | 方式 | 説明 |
|---|---|---|
| 層1 | ルールベース | キーワード部分一致、正規表現 |
| 層2 | 類似度検索 | 過去取引との類似度(レーベンシュタイン距離、TF-IDF) |
| 層3 | 税務ルール参照 | 消費税判定DB・仕訳Tipsをスキル/スラッシュコマンド経由で参照 |
| 層4 | Claude判断 | 上記で判定できないものをClaudeが提案 |
層3について: 税務書籍(消費税の実務書等)をOCR・裁断してデータベース化したもの、および仕訳で誤りやすい事例を集めたTips集をマニュアルとして整備。これをClaude Codeのスキルまたはスラッシュコマンドとして登録し、判断の拠り所として参照する。
データ構造
顧問先ごとにDB分離
data/
├── clients.db # メタDB(顧問先一覧)
├── client_001/
│ ├── client_001.db # 顧問先の取引データ
│ ├── files/ # 証憑ファイル
│ │ └── 2026-01/
│ │ └── receipt_001.pdf
│ └── backups/ # 日次スナップショット
│ ├── 2026-01-07.db
│ └── 2026-01-08.db
機密性を確保しつつ、顧問先単位でバックアップ・移動が可能。
顧問先の自動判定
全てのコマンドはカレントディレクトリから顧問先を自動判定する。
# 顧問先ディレクトリに移動
cd data/client_001
# 以降のコマンドは顧問先IDの指定不要
/import-receipts ./receipts/2025-01/
/suggest
/status
判定ロジック:
- カレントディレクトリが
data/{client_id}/配下かチェック - 該当すれば
{client_id}を自動設定 - 該当しなければエラー(
data/配下で実行してください)
スラッシュコマンド一覧
9つのコマンドを定義。現時点では仮説ベースの設計。
| コマンド | 概要 |
|---|---|
/import-csv | CSV取り込み |
/import-receipts | レシート一括OCR |
/validate | バリデーション実行 |
/suggest | 仕訳候補を提案 |
/approve | 仕訳候補を承認 |
/reject | 仕訳候補を却下 |
/edit | 仕訳を編集 |
/status | 処理状況を表示 |
/export-mf | MF取込用CSVを出力 |
業務フローチャート
役割分担サマリ
| フェーズ | コマンド | Claude Code(自動処理) | 人間(確認・判断) |
|---|---|---|---|
| 取り込み | /import-csv/import-receipts | CSVパース、OCR、重複検出、DB登録 | 取り込み件数・重複候補の確認 |
| 検証 | /validate | 整合性チェック、エラー検出 | 警告内容確認、修正要否判断 |
| 提案 | /suggest | 4層構造で仕訳候補を自動生成 | 提案内容・未分類の確認 |
| 承認 | /status/approve/reject/edit | 状況表示、登録処理、学習 | 各仕訳の最終判断・承認 |
| 出力 | /export-mf | MF形式CSV生成 | MFへの取り込み作業 |
/import-csv - CSV取り込み
マネーフォワードや銀行明細などのCSVをDBに取り込む。
/import-csv <CSVファイルパス> [--type <種別>]
| 引数 | 必須 | 説明 |
|---|---|---|
| CSVファイルパス | ○ | 取り込むCSVファイル |
| --type | △ | mf / bank / cc(自動判定も可) |
処理内容
- CSVファイルを読み込み
- 種別に応じてパース(MF形式 / 銀行形式 / クレカ形式)
- 重複チェック(日付 + 金額 + 摘要 で既存データと照合)
- 取引データとしてDB登録
出力例
✓ 取り込み完了
- 新規: 45件
- 重複スキップ: 3件
- エラー: 0件
重複候補:
#123: 2025-01-15 ¥5,000 コンビニ(既存: #45 と類似)
/import-receipts - レシート一括OCR
レシート・領収書の画像を一括でOCR処理し、取引データとしてDB登録。
/import-receipts <画像ディレクトリ or ファイル> [--method <方式>]
| 引数 | 必須 | 説明 |
|---|---|---|
| パス | ○ | 画像ファイル or ディレクトリ |
| --method | △ | api(Python API)/ claude(サブエージェント) |
処理方式
| 方式 | 説明 | 用途 |
|---|---|---|
| Python API | 外部OCR API(Google Vision / Claude API)を並列処理 | 大量処理向け |
| Claude Code | Claude自身が画像を見て抽出 | 少量、対話的処理 |
抽出データ
{
"date": "2025-01-15",
"amount": 5000,
"store": "コンビニA",
"description": "事務用品",
"confidence": 0.95,
"source_file": "files/2025-01/receipt_001.jpg"
}
出力例
✓ OCR処理完了
- 処理: 20件
- 成功: 18件
- 要確認: 2件(信頼度低)
要確認:
#15: receipt_015.jpg - 金額不明瞭
#18: receipt_018.jpg - 日付読み取り失敗
/validate - バリデーション実行
取り込んだ取引データの重複・欠落・整合性チェックを実行。
/validate [--period <期間>] [--check <チェック種別>]
| 引数 | 必須 | 説明 |
|---|---|---|
| --period | △ | 2025-01 / 2025 / all(デフォルト: 当月) |
| --check | △ | all / duplicate / cross / date / balance / voucher |
チェック項目
| チェック | 内容 |
|---|---|
| duplicate | 同一取引の重複を検出 |
| cross | クレカ明細↔領収書、クレカ締め↔銀行引落の突合 |
| date | 取引日の欠落を検出 |
| balance | 前日残高 + 当日取引 = 当日残高 を検証 |
| voucher | 証憑(領収書・レシート)の有無を確認 |
| 必須フィールド | 日付、金額、摘要の欠落を検出 |
クロスチェック(突合)の詳細
複数データソース間の整合性を検証する。
1. クレカ明細 ↔ 領収書/レシート突合
クレカ明細 領収書/レシート
┌──────────────────────┐ ┌──────────────────────┐
│ 日付: 2025-01-15 │ ←──→ │ 日付: 2025-01-15 │
│ 金額: ¥5,000 │ 一致 │ 金額: ¥5,000 │
│ 摘要: Amazon │ │ 店舗: Amazon │
└──────────────────────┘ └──────────────────────┘
↓ マッチ
領収書添付済みフラグ = true
→ 仕訳: 借方 費用科目 / 貸方 未払金(補助: クレカ名)
- 日付 + 金額が一致: 重複候補としてフラグ
- マッチ時: 領収書をクレカ明細に紐付け、証憑添付済みとする
- クレカ明細のみ(領収書なし): Web明細取引として独立処理(例: Google Cloud、サブスク)
2. クレカ締め日 ↔ 銀行引落突合
クレカ明細(楽天カード) 銀行引落
┌──────────────────────┐ ┌──────────────────────┐
│ 1/1〜1/31 利用分 │ │ 日付: 2025-02-27 │
│ 締め日: 1/31 │ ───→ │ 金額: ¥150,000 │
│ 引落日: 2/27 │ 一致 │ 摘要: ラクテンカード │
│ 合計: ¥150,000 │ └──────────────────────┘
└──────────────────────┘
↓ マッチ
仕訳: 借方 未払金(補助: 楽天カード) / 貸方 普通預金(補助: 銀行口座名)
カード締め日マスタ
{
"credit_cards": [
{"name": "楽天カード", "closing_day": 31, "payment_day": 27, "payment_month_offset": 1},
{"name": "三井住友カード", "closing_day": 15, "payment_day": 10, "payment_month_offset": 1},
{"name": "アメックス", "closing_day": 19, "payment_day": 10, "payment_month_offset": 1}
]
}
仕訳パターン(事業形態別)
現金出金の場合
| 事業形態 | 借方 | 貸方 |
|---|---|---|
| 個人事業主 | 費用科目 | 事業主借 |
| 法人 | 費用科目 | 代表者借入金 |
法人の場合: 代表者が立て替えた経費は一旦「代表者借入金」で処理。後日精算時に「代表者借入金 / 普通預金」で消し込む。
クレカ決済の場合
| タイミング | 借方 | 貸方 |
|---|---|---|
| 利用時 | 費用科目 | 未払金(補助: クレカ名) |
| 引落時 | 未払金(補助: クレカ名) | 普通預金(補助: 銀行口座名) |
証憑チェック
| 取引種別 | 証憑要否 | 説明 |
|---|---|---|
| 現金支出 | ○ 必須 | 領収書/レシートが必要 |
| クレカ(店舗) | ○ 必須 | 領収書/レシートが必要 |
| クレカ(Web) | △ 不要 | 明細自体が証憑(Google Cloud, サブスク等) |
| 銀行振込 | △ | 通帳記帳で代替可 |
| 銀行引落(クレカ) | × 不要 | クレカ明細との突合で検証 |
出力例
✓ バリデーション完了(2025年1月)
【重複検出】OK - 0件
【クロスチェック】
- クレカ↔領収書: 45件マッチ、3件未マッチ
- クレカ締め↔銀行引落: 2件マッチ(楽天¥150,000、三井住友¥80,000)
【日付連続性】警告 - 1件
- 2025-01-15 のデータがありません
【残高整合性】OK
【証憑チェック】警告 - 5件
- #45: 現金支出 ¥3,000 証憑なし
- #67: クレカ利用 ¥12,000 証憑なし(Web明細?)
【必須フィールド】警告 - 3件
- #45: 摘要が空
- #67: 勘定科目未設定
サマリ: 警告9件、エラー0件
次のアクション:
- 証憑なし取引を確認: /status --view missing-voucher
- Web明細取引をマーク: /edit 67 --field voucher_type=web
自動修正オプション
/validate --fix
明らかな重複は自動削除(確認付き)、空フィールドには「要入力」フラグを付与。
/suggest - 仕訳候補提案
取引データに対して、4層構造で仕訳候補を提案。
/suggest [--period <期間>] [--layer <層>] [--limit <件数>]
| 引数 | 必須 | 説明 |
|---|---|---|
| --period | △ | 2025-01 / 2025(デフォルト: 未仕訳のみ) |
| --layer | △ | 1 / 2 / 3 / 4 / all(デフォルト: all) |
| --limit | △ | 処理件数上限(デフォルト: 100) |
4層構造の詳細
層1: ルールベース
rules = [
{"pattern": "Amazon", "debit": "消耗品費", "credit": "普通預金"},
{"pattern": "電気代", "debit": "水道光熱費", "credit": "普通預金"},
{"pattern": r"交通費|電車|バス", "debit": "旅費交通費", "credit": "現金"},
]
層2: 類似度検索
# 過去2年分の取引+仕訳データを参照
# 類似度閾値: 0.8 以上
similar = find_similar_transactions(
query=current_transaction.description,
history=past_transactions,
threshold=0.8
)
層3: 税務ルール参照(スキル/スラッシュコマンド)
層1, 2で判定できなかった取引に対し、以下のナレッジベースを参照して判断:
- 消費税判定DB: 税務書籍(消費税の実務書等)をOCR・裁断してデータベース化。課税/非課税/不課税/輸出免税などの判定ルールを体系的に参照
- 仕訳Tipsマニュアル: 誤りやすい仕訳事例を集めた実務Tips集。よくある間違いパターンと正しい処理方法を参照
# スキルまたはスラッシュコマンドとして登録
# 例: /tax-rules consumption-tax "飲食代"
# 例: Skill("tax-rules")
tax_result = invoke_skill_or_command(
name="tax-rules",
query=current_transaction.description,
context={"amount": amount, "vendor": vendor}
)
層4: Claude判断
層1〜3で判定できなかったものをClaudeが内容を見て判断・提案。
出力例
✓ 仕訳候補提案完了
【層1: ルールベース】32件マッチ
【層2: 類似度検索】45件マッチ
【層3: 税務ルール参照】12件マッチ
【層4: Claude判断】8件提案
未分類(提案できず): 5件
- #123: 2025-01-15 ¥50,000 振込 ヤマダ(詳細不明)
提案一覧を確認するには:
/status --view pending
提案データ構造
{
"id": 1,
"transaction_id": 123,
"status": "pending",
"layer": 2,
"confidence": 0.85,
"debit_account": "消耗品費",
"credit_account": "普通預金",
"amount": 5000,
"reason": "過去取引 #45 と類似(類似度: 0.92)"
}
/approve - 仕訳候補承認
提案された仕訳候補を承認し、正式な仕訳として登録。
/approve <対象> [--force]
| 引数 | 必須 | 説明 |
|---|---|---|
| 対象 | ○ | <ID> / <ID範囲> / all / high-confidence |
| --force | △ | 確認なしで実行 |
使用例
# 単一承認
/approve 123
# 範囲承認
/approve 123-150
# 信頼度高いもの一括承認(confidence >= 0.9)
/approve high-confidence
# 全件承認(要確認)
/approve all
確認プロンプト
以下の仕訳候補を承認しますか?
#123: 2025-01-15 消耗品費 / 普通預金 ¥5,000(Amazon)
#124: 2025-01-16 旅費交通費 / 現金 ¥1,200(電車代)
#125: 2025-01-17 水道光熱費 / 普通預金 ¥8,500(電気代)
合計: 3件
承認しますか? (y/n)
出力例
✓ 承認完了: 3件
#123 → 仕訳 J-456 として登録
#124 → 仕訳 J-457 として登録
#125 → 仕訳 J-458 として登録
/reject - 仕訳候補却下
提案された仕訳候補を却下。却下理由は学習データとして活用。
/reject <対象> [--reason <理由>] [--reassign]
| 引数 | 必須 | 説明 |
|---|---|---|
| 対象 | ○ | <ID> / <ID範囲> |
| --reason | △ | 却下理由(学習データとして活用) |
| --reassign | △ | 却下後、再度提案を依頼 |
使用例
# 理由付きで却下
/reject 123 --reason "勘定科目が違う、正しくは接待交際費"
# 却下して再提案依頼
/reject 123 --reassign
--reassign の場合
✓ 却下完了: #123
再提案中...
【Claude判断】
取引内容: Amazon ¥5,000 「贈答品」
推奨仕訳: 接待交際費 / 普通預金 ¥5,000
理由: 摘要に「贈答品」とあるため、消耗品費ではなく接待交際費が適切
新しい提案 #123-2 を作成しました。
承認する場合: /approve 123-2
学習への活用
却下理由は以下に活用:
- ルールベースの改善(誤マッチパターンの除外)
- 類似度検索の重み調整
- Claude判断時の参考情報
/edit - 仕訳編集
仕訳候補または確定済み仕訳を編集。
/edit <ID> [--field <フィールド>=<値>]
| 引数 | 必須 | 説明 |
|---|---|---|
| ID | ○ | 仕訳候補ID or 仕訳ID |
| --field | △ | 直接値を指定(対話なし) |
使用例
# 対話的に編集
/edit 123
# フィールド直接指定
/edit 123 --field debit=接待交際費
# 複数フィールド
/edit 123 --field debit=接待交際費 --field amount=6000
対話モード
現在の仕訳:
日付: 2025-01-15
借方: 消耗品費
貸方: 普通預金
金額: ¥5,000
摘要: Amazon 贈答品
編集するフィールドを選択:
1. 日付
2. 借方勘定科目
3. 貸方勘定科目
4. 金額
5. 摘要
6. 完了(保存)
0. キャンセル
編集可能フィールド
| フィールド | キー | 説明 |
|---|---|---|
| 日付 | date | YYYY-MM-DD形式 |
| 借方勘定科目 | debit | 勘定科目名 |
| 貸方勘定科目 | credit | 勘定科目名 |
| 金額 | amount | 数値 |
| 摘要 | description | 文字列 |
| 税区分 | tax_category | 課税/非課税/不課税 |
| 補助科目 | sub_account | 補助科目名 |
/status - 処理状況確認
現在の処理状況、仕訳候補の状態、集計情報を表示。
/status [--view <ビュー>] [--period <期間>]
| 引数 | 必須 | 説明 |
|---|---|---|
| --view | △ | summary / pending / approved / rejected / unclassified |
| --period | △ | 2025-01 / 2025(デフォルト: 当月) |
ビュー: summary(デフォルト)
📊 ステータス(2025年1月)
【取引データ】
取り込み済み: 150件
仕訳済み: 120件
未仕訳: 30件
【仕訳候補】
提案中(pending): 25件
承認済み(approved): 95件
却下(rejected): 5件
【未分類】
層1-3で判定不可: 5件
要確認(低信頼度): 3件
次のアクション:
/suggest --limit 30 # 未仕訳を処理
/approve high-confidence # 高信頼度を一括承認
ビュー: pending
📋 未承認の仕訳候補
#123 | 2025-01-15 | 消耗品費/普通預金 | ¥5,000 | Amazon | 信頼度:0.92 | 層2
#124 | 2025-01-16 | 旅費交通費/現金 | ¥1,200 | 電車代 | 信頼度:0.95 | 層1
#125 | 2025-01-17 | 水道光熱費/普通預金 | ¥8,500 | 電気代 | 信頼度:0.88 | 層2
合計: 25件
操作:
/approve 123-125 # 範囲承認
/approve high-confidence # 高信頼度一括承認
ビュー: unclassified
❓ 未分類の取引
#201 | 2025-01-15 | ¥50,000 | 振込 ヤマダ | 詳細不明
#202 | 2025-01-20 | ¥3,000 | カード | 摘要なし
合計: 5件
これらはClaude判断が必要です:
/suggest --layer 3 # Claudeに判断を依頼
/export-mf - マネーフォワード用CSV出力
承認済みの仕訳をマネーフォワード取込用のCSV形式で出力。
/export-mf [--period <期間>] [--status <ステータス>] [--output <出力先>]
| 引数 | 必須 | 説明 |
|---|---|---|
| --period | △ | 2025-01 / 2025(デフォルト: 当月) |
| --status | △ | approved / all(デフォルト: approved) |
| --output | △ | 出力先パス |
MF取込CSV形式
取引日,借方勘定科目,借方補助科目,借方税区分,貸方勘定科目,貸方補助科目,貸方税区分,金額,摘要
2025-01-15,消耗品費,,課税仕入10%,普通預金,,,5000,Amazon 事務用品
2025-01-16,旅費交通費,,非課税,現金,,,1200,電車代 新宿-渋谷
出力例
✓ エクスポート完了(2025年1月)
出力ファイル:
exports/mf_import_2025-01_20260108.csv
内容:
仕訳件数: 95件
合計金額: ¥1,234,567
取り込み手順:
1. マネーフォワードにログイン
2. 仕訳帳 → インポート → CSV取込
3. 上記ファイルを選択
4. プレビューを確認して取込実行
差分エクスポート
# 前回エクスポート以降の新規承認分のみ
/export-mf --diff
前回エクスポート日時を記録し、差分のみ出力(重複取込を防止)。
まとめ
このコマンド設計により、以下のワークフローが実現する:
/import-csvまたは/import-receiptsでデータ取り込み/validateで自動バリデーション/suggestで4層構造の仕訳候補提案/statusで状況確認しながら/approve/reject/editで処理/export-mfでマネーフォワードに取り込み
全ての操作をClaude Code CLIで完結させることで、キーボードから手を離さずに記帳作業を進められる。