◉CLAUDE LABEN
●2.1.300 — Mod のプロンプト装飾 virtualText が追加され、終了後1.5秒たっても動くバックグラウンドコマンドは強制終了されます●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り46日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●CACHE — Sonnet 5.5 のキャッシュ読み取りが 0.20 から 0.10 ドル/100万トークンに下がりました(10/07)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.300 — Mod のプロンプト装飾 virtualText が追加され、終了後1.5秒たっても動くバックグラウンドコマンドは強制終了されます●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り46日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●CACHE — Sonnet 5.5 のキャッシュ読み取りが 0.20 から 0.10 ドル/100万トークンに下がりました(10/07)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude.ai
◉ Claude.ai/2026-10-15初級

見積書の文面は Claude に、金額は自分の手元に残す — 小さな正本と検算スクリプトで分けた線引き

個人事業主が見積書・請求書の文面を Claude に整えてもらうとき、金額だけは正本の JSON に置いて検算する手順。依頼文の型と、動く Python の検算スクリプト付きです。

Claude50見積書請求書個人事業主ワークフロー21検算Python22

受託のサイト制作で見積書を出す前の晩のことです。項目は四つ、金額も決まっていて、あとは取引先への添え書きを整えるだけでした。

こういうとき、文面づくりは Claude にとても向いています。丁寧すぎず、くだけすぎない一通を、数十秒で返してくれます。

ただ、依頼文に金額まで書き込んで下書きを頼むと、返ってきた文章の中で数字が静かに動くことがあります。桁が変わるわけではありません。「合計」の隣に置かれた数字が、小計だったり、税抜だったりするのです。

文面は読み返せば直せます。数字は、読み返しただけでは気づけません。いま思えば、ここが今回の線引きの出発点だったのだと思います。

数字を渡さないという選び方

最初にお伝えしたいのは、Claude の計算力を疑っているわけではない、ということです。

足し算と消費税の計算そのものは、たいてい正しく返ってきます。問題はその手前にあります。金額が文章のあちこちに散ると、どれが正本なのか、自分でも分からなくなるのです。

私が選んだのは、役割を二つに分ける方法でした。

役割誰が持つか置き場所
項目・単価・数量・税率私手元の JSON(正本)
小計・消費税・合計の計算スクリプト下の Python
添え書き・件名・お礼の言い回しClaudeチャットの下書き
最後の突き合わせスクリプトと私送る直前

見積書の PDF そのものは、私は別の仕組みで JSON から書き出しています。ここで扱うのは、文面だけを Claude に頼む部分です。

正本は小さな JSON 一枚で足ります

正本といっても大げさなものではありません。項目名、単価、数量だけを並べたファイルです。

{
  "items": [
    {"name": "トップページ制作", "unit_price": 120000, "qty": 1},
    {"name": "下層ページ", "unit_price": 30000, "qty": 3}
  ]
}

これを quote.json として保存します。金額を直すときは、必ずこのファイルだけを直します。文面の側に数字を直接書き足さない、というのが約束です。

Claude への依頼文は「数字の穴」を残して書く

下書きを頼むときは、金額を伏せ字にして渡します。型は次のとおりです。

取引先へ送る見積書の添え書きを、です・ます調で 4 文以内で書いてください。
- 件名: 〇〇様 コーポレートサイト制作のお見積り
- 項目は 2 つ(トップページ制作/下層ページ 3 枚)
- 金額は書かず、合計の箇所は「【合計金額】」と置いてください
- 有効期限の箇所は「【期限】」と置いてください
- 締めは、質問があれば遠慮なくどうぞ、という一言にしてください

返ってきた文章には「【合計金額】」「【期限】」が残ります。ここに入れる数字は、次のスクリプトが出した値だけです。

検算スクリプト: 文面に紛れた数字を拾う

下書きに数字を入れたあと、正本と突き合わせるスクリプトを走らせます。やっていることは三つです。正本から小計・消費税・合計を計算し、文面に出てくる 4 桁以上の数字を拾い、正本から作れない数字があれば止めます。それだけの小さな番人です。

import json, re, sys
from decimal import Decimal, ROUND_DOWN
 
 
def load(path):
    with open(path, encoding="utf-8") as f:
        return json.load(f)
 
 
def calc(items, rate=Decimal("0.10")):
    subtotal = sum(Decimal(i["unit_price"]) * Decimal(i["qty"]) for i in items)
    # 消費税は税率ごとに 1 回だけ端数処理する(ここでは切り捨て)
    tax = (subtotal * rate).quantize(Decimal("1"), rounding=ROUND_DOWN)
    return subtotal, tax, subtotal + tax
 
 
def amounts_in(text):
    found = set()
    for m in re.finditer(r"[0-9][0-9,]*", text):
        s = m.group().replace(",", "")
        if len(s) >= 4:  # 年号や電話番号の断片を避けるため 4 桁以上に限る
            found.add(int(s))
    return found
 
 
def main(json_path, draft_path):
    doc = load(json_path)
    subtotal, tax, total = calc(doc["items"])
    allowed = {int(subtotal), int(tax), int(total)}
    allowed |= {int(Decimal(i["unit_price"]) * Decimal(i["qty"])) for i in doc["items"]}
    allowed |= {int(i["unit_price"]) for i in doc["items"]}
    with open(draft_path, encoding="utf-8") as f:
        draft = f.read()
    stray = sorted(amounts_in(draft) - allowed)
    missing = sorted({int(total)} - amounts_in(draft))
    print(f"小計 {int(subtotal):,} / 消費税 {int(tax):,} / 合計 {int(total):,}")
    if stray:
        print("正本にない数字:", [f"{n:,}" for n in stray])
    if missing:
        print("文面に合計が出ていません:", [f"{n:,}" for n in missing])
    sys.exit(1 if stray or missing else 0)
 
 
if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2])

check_amounts.py として保存し、次のように使います。

python3 check_amounts.py quote.json draft.txt

手元で試すと、結果は次のようになります。上の JSON なら、小計 210,000、消費税 21,000、合計 231,000 です。合計が 231,000 と書かれた文面は通り、うっかり 213,000 と書いた文面は「正本にない数字」と「文面に合計が出ていません」の二行で止まります。数字の入れ替わりのような、人間の目が滑りやすい誤りほど、機械は素直に拾ってくれます。

なぜ端数の丸めを一か所にしたのか

行ごとに消費税を計算して足し上げると、合計が一円ずれることがあります。コードの中で calc の一か所だけで丸めているのは、そのためです。

丸め方(切り捨て・四捨五入)は、取引先との取り決めや書式によって変わります。ここでは切り捨てにしていますが、ご自身の運用に合わせて rounding= の一行だけ差し替えていただければ、そのまま使えます。大事なのは「どこで丸めるか」を一か所に決めておくことで、数字を文章の側に散らさないことと同じ考え方です。

運用してみて決めた小さな決まり

個人開発の延長で受託の見積を出すようになってから、いくつか決まりを足してきました。

  • 金額の直しは quote.json だけにします。チャットに戻って「この金額で書き直して」とは頼みません
  • 文面を Claude に頼むときは、取引先の社名と担当者名も伏せ字にしておきます
  • スクリプトが通ってから、最後に声に出して一度だけ読みます

三つ目は、機械ではなく私の仕事として残しています。声に出すと、数字より先に「この言い回しは相手に失礼ではないか」という引っかかりが見つかることが多いのです。数字は正本が、言葉は Claude が、最後の一読は私が。 この分担は、忙しい週ほど崩さないようにしております。

次にやること

まずは直近に出した見積書を一枚選んで、項目と金額だけを quote.json に書き写してみてください。そのうえで、次の見積では「【合計金額】」の穴を残した依頼文から始めていただければ、十分に効果を感じていただけると思います。

シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

◉ Claude.ai2026-10-09
最初の依頼文が毎回ちぐはぐだった私が、「仕事の説明」を1枚だけ先に渡すことにした理由
Claude に何かを頼むたびに、的外れな答えが返ってくる。原因は依頼文の書き方より、自分の仕事を一度も説明していないことでした。非エンジニアでも今日書ける「仕事の説明」1枚の作り方と、最初の依頼文への組み込み方をまとめます。
◉ Claude.ai2026-10-03
使用量の上限が昼前に尽きた日、原因は送った回数ではなく一通の会話の長さでした
Pro や Max で「使用量の上限に達しました」が思ったより早く出たとき、Settings > Usage の二本のバー・その会話の往復数と添付・モデルと effort の順に見ています。昼前に止まった日の切り分けと、新しい会話へ移す線引きを書き残します。
◉ Claude.ai2026-08-18
透かし入りの生成テキストを、アプリの配信物に載せる前に決めておくこと
2026年8月2日以降のClaudeモデルは生成テキストに機械可読の透かしを埋め、ファイルにはC2PA署名メタデータを付けます。個人開発の配信物でどこまで通してよいかの線引きと、出所を再現できる提出ゲートの作り方を実測とコードで整理します。