$npx -y skills add kazukinagata/shinkoku --skill reading-receiptレシート・領収書・ふるさと納税受領証明書の画像を読み取り構造化データを返す。 他のスキルから呼び出されるほか、直接ユーザーが呼び出すことも可能。
| 1 | # レシート・領収書・ふるさと納税受領証明書 画像読み取り |
| 2 | |
| 3 | レシート・領収書・ふるさと納税受領証明書の画像を読み取り、構造化データとして返すスキル。 |
| 4 | |
| 5 | ## PDF ファイルの場合 |
| 6 | |
| 7 | ファイルが PDF(`.pdf`)の場合、画像 OCR の前にテキスト抽出を試みる。 |
| 8 | |
| 9 | 1. `shinkoku pdf extract-text --file-path <path>` を実行する |
| 10 | 2. 抽出テキストに必要な情報(金額・日付・店舗名等)が含まれていれば、テキストから構造化データを生成する |
| 11 | 3. テキストが不十分(スキャン PDF 等)の場合は `shinkoku pdf to-image --file-path <path> --output-dir <dir>` で PNG に変換し、以下の画像読み取りフローに進む |
| 12 | |
| 13 | ## 画像読み取り方法 |
| 14 | |
| 15 | ### 推奨: デュアル検証(並列2コンテキスト) |
| 16 | |
| 17 | 精度を高めるため、同じ画像を2つの独立したコンテキストで並列に読み取り、結果を照合する。 |
| 18 | |
| 19 | 1. **2つの独立した読み取りを実行する:** |
| 20 | サブエージェントが使える環境では、2つのサブエージェントを並列で起動し、それぞれ独立に画像を読み取る。 |
| 21 | 各サブエージェントには以下の「基本ルール」と「出力フォーマット」をプロンプトとして渡し、画像ファイルパスを指定する。 |
| 22 | |
| 23 | 2. **結果照合:** 両方の読み取り結果から主要フィールド(金額等)を比較する。 |
| 24 | |
| 25 | 3. **一致の場合:** そのまま採用。「2つの独立した読み取りで結果が一致しました」と報告する。 |
| 26 | |
| 27 | 4. **不一致の場合:** ユーザーに元画像パスと両方の結果を提示し、正しい方を選択してもらう: |
| 28 | - 差異のあるフィールドを明示する |
| 29 | - A を採用 / B を採用 / 手動入力 の3択を提示する |
| 30 | |
| 31 | ### フォールバック(サブエージェント非対応の場合) |
| 32 | |
| 33 | サブエージェントが利用できない環境では、以下の手順で読み取る: |
| 34 | |
| 35 | 1. 画像ファイルを直接 Read ツールで読み取る |
| 36 | 2. 以下の「基本ルール」と「出力フォーマット」に従ってデータを抽出する |
| 37 | 3. 抽出結果をユーザーに提示し、**必ず目視確認を依頼する** |
| 38 | |
| 39 | ⚠ デュアル検証が利用できないため、必ずユーザーに目視確認を依頼してください。 |
| 40 | |
| 41 | ## 基本ルール |
| 42 | |
| 43 | - 画像ファイルは Read ツールで読み取る(Claude Vision が自動的に画像を認識する) |
| 44 | - 金額は必ず int(円単位の整数)で返す。カンマや「円」は除去する |
| 45 | - 日付は YYYY-MM-DD 形式で返す |
| 46 | - 和暦は西暦に変換する(令和7年 → 2025、令和6年 → 2024、平成31年 → 2019) |
| 47 | - 読み取れないフィールドは UNKNOWN(文字列)または 0(金額)とする |
| 48 | - 複数ファイルを渡された場合は全て順に処理してまとめて返す |
| 49 | |
| 50 | ## 出力フォーマット |
| 51 | |
| 52 | ### レシート・領収書の場合 |
| 53 | |
| 54 | 画像を読み取り、以下の形式で返す: |
| 55 | |
| 56 | ``` |
| 57 | ---RECEIPT_DATA--- |
| 58 | date: YYYY-MM-DD |
| 59 | vendor: 店舗名 |
| 60 | total_amount: 金額(int) |
| 61 | tax_included: true/false |
| 62 | items: |
| 63 | - name: 品目名 |
| 64 | amount: 金額(int) |
| 65 | quantity: 数量(int) |
| 66 | ---END--- |
| 67 | ``` |
| 68 | |
| 69 | ### ふるさと納税受領証明書の場合 |
| 70 | |
| 71 | 画像を読み取り、以下の形式で返す: |
| 72 | |
| 73 | ``` |
| 74 | ---FURUSATO_RECEIPT_DATA--- |
| 75 | municipality_name: 自治体名(市区町村名) |
| 76 | prefecture: 都道府県名 |
| 77 | amount: 寄附金額(int) |
| 78 | date: YYYY-MM-DD |
| 79 | receipt_number: 受領証明書番号(記載がなければ UNKNOWN) |
| 80 | ---END--- |
| 81 | ``` |
| 82 | |
| 83 | ## 抽出のポイント |
| 84 | |
| 85 | ### レシート・領収書 |
| 86 | |
| 87 | - 合計金額(税込)を最優先で抽出する |
| 88 | - 内税・外税の区別を確認する(「税込」「税抜」の記載) |
| 89 | - 品目は読み取れる範囲で抽出する(不明な場合は items を空にする) |
| 90 | - 店舗名はレシート上部のロゴや名称から抽出する |
| 91 | - 日付はレシート上の取引日を使用する(発行日ではなく) |
| 92 | |
| 93 | ### ふるさと納税受領証明書 |
| 94 | |
| 95 | - 「寄附金受領証明書」というタイトルを確認する |
| 96 | - 自治体名は「○○市」「○○町」「○○村」等の正式名称を抽出する |
| 97 | - 都道府県名は自治体名の前に記載されていることが多い |
| 98 | - 寄附金額は「金額」「寄附金額」欄から抽出する |
| 99 | - 日付は寄附を受領した日(受領日)を使用する |
| 100 | - 受領証明書番号は「第○○号」等の記載から抽出する |
| 101 | |
| 102 | ## 複数ファイルの処理 |
| 103 | |
| 104 | 複数のファイルパスが指示された場合、または Glob パターンでファイル一覧を取得した場合: |
| 105 | |
| 106 | 1. Glob ツールでファイル一覧を取得する(パターンが指示された場合) |
| 107 | 2. 各ファイルを Read ツールで順に読み取る |
| 108 | 3. 全ファイルの結果をまとめて返す(各結果の前にファイル名を記載する) |
| 109 | |
| 110 | ``` |
| 111 | ## file1.jpg |
| 112 | ---RECEIPT_DATA--- |
| 113 | ... |
| 114 | ---END--- |
| 115 | |
| 116 | ## file2.jpg |
| 117 | ---RECEIPT_DATA--- |
| 118 | ... |
| 119 | ---END--- |
| 120 | ``` |