6-2 Claude Code で社内ツールを 1 時間で作る
無料Claude Code で社内向け業務 Web ツールを 1 時間でプロトタイプする手順とパターン。要件分解、UI 構成、データ保存、社内共有まで、見積・在庫・名簿などすぐ使える 3 つの実例で身につけます。
このレッスンで身につくこと
前のレッスン 6-1 では 外向け の LP を 30 分で形にしました。今度は 内向け、つまり社内で毎日のように動かす 業務 Web ツール を 1 時間で立ち上げます。LP が「見せる」ためのものだったのに対し、社内ツールは「使ってもらう」ためのもの。設計の優先順位がまったく違う ところが面白いポイントです。
このレッスンのゴール
- 社内ツールに Claude Code が 向く領域 と向かない領域を区別できる
- HTML 単体 / React / Next.js / Streamlit を寿命と人数で使い分けられる
- 見積書 / 問い合わせ管理の 2 つの実例 をプロンプトから自分で再現できる
- 認証・データ保存 の最小設計を理解し、DB に切り替えるタイミングを判断できる
- 失敗パターン を事前に潰し、メンテ放棄される社内ツールを量産しない
- 業務別 プロンプトテンプレ 3 種 を
CLAUDE.mdにストックして即呼び出せる
所要時間 — 約 60 分(読むだけなら 25 分) 難易度 — ★★☆☆☆
なぜ社内ツールは Claude Code の最良の戦場なのか
外向けプロダクトには デザイン・SEO・ブランド・スケール など満たす基準が山ほどありますが、社内ツールに求められるのは 「明日の業務を 30 分短くする」 の一点だけ。綺麗じゃなくていい・SEO もいらない・ユーザーは 5 人 — この緩い制約こそが、Claude Code が最も力を発揮する条件です。
社内ツールの評価軸は 「業務時間を何分削ったか」 の 1 点。 見た目やコードの綺麗さは二の次。「とりあえず動く・とりあえず配れる」を最短で達成するのが Claude Code 時代の社内ツール開発の本質です。
LP と社内ツールの違い
| LP(6-1) | 社内ツール(6-2) | |
|---|---|---|
| 目的 | 訪問者に行動させる | 自分や同僚の業務を短縮 |
| 評価軸 | CVR | 削った業務時間 |
| ユーザー数 | 数千〜数十万 | 5〜50 人 |
| デザインの重み | 大 | 小 |
| データ永続化 | ほぼ不要 | 必須 |
| 寿命 | 数ヶ月 | 半年〜数年 |
データを溜める と 長く使われる の 2 つが、LP との決定的な違いです。
「自分で作る」威力
外注では小さすぎる、Excel では限界がある 絶妙な隙間 を、自分で 1 時間で埋められる というのが Claude Code 時代の最大の変化です。仕様を伝えるコストが消える のが本質。「自分の頭の中の業務知識」がそのまま動くアプリになります。
社内ツールのよくあるユースケース 5 つ
「うちにも 1 つあるな」と思える例が必ず混ざっています。
- 帳票生成ツール — 見積書 / 請求書 / 領収書 / 納品書。Excel テンプレ運用の Web 化候補 No.1
- CRUD 管理ツール — 問い合わせ / 顧客 / 商品マスタ / 案件。「作成・閲覧・更新・削除」の 4 操作で成立
- 集計レポートツール — 売上 / 工数 / 在庫の月次レポートをボタン 1 回で
- 外部 API ラッパー — Slack 通知 / メール一斉 / 配送追跡を GUI から
- ルール自動判定ツール — 経費チェック / 与信判定 / 価格設定。if 文の塊 + 入力フォーム 1 つ
新しいアイデアが浮かんだら、この 5 つのどれに分類できるかをまず判定すると、構造の判断が一瞬で終わります。
技術スタックの選択 — 4 つの選択肢
| 選択肢 | 制作時間 | データ保存 | 同時編集 | 向く用途 |
|---|---|---|---|---|
| HTML + localStorage | 30 分 | ブラウザ単位 | × | 個人ツール、雛形検証 |
| React + ローカル JSON | 1〜2 時間 | ファイル | × | 単一 PC で動くツール |
| React Router + DB | 3〜6 時間 | サーバ | ○ | 5〜50 人の本格ツール |
| Streamlit | 1 時間 | サーバ | △ | 集計・データ分析 GUI |
データを 1 人だけが触る なら HTML + localStorage で十分。2 人以上が同時編集 するならサーバ + DB が必須。ここを誤ると、3 ヶ月後に「誰かが上書きしてデータが消えた」事件が必ず起きます。
迷ったときの初手
- 自分一人で使う → HTML + localStorage
- 同僚 2-3 人と共有 → HTML を共有フォルダ + JSON エクスポート
- 部署 5 人以上で同時利用 → React Router + DB(最初から)
- データ分析の GUI → Streamlit
実例 1 — 見積書作成ツール(HTML 単体)
「1 ファイルで動く・社内共有フォルダに置くだけで使える」見積書ツールを 30 分で立ち上げます。
Step 1 — 業務要件を 1 枚に
誰が使う: 営業 5 名
今の作業: Excel テンプレを毎回コピーして、宛名と品目を手入力
所要時間: 1 件あたり 15 分(年間 200 件 → 50 時間)
問題: 計算ミス、体裁崩れ、PDF 化が手作業
ゴール: 入力 → ボタン 1 回で PDF所要時間と件数を数字で書く のがコツ。「半日で作って投資回収」の一言で上司にも通せます。
Step 2 — 初回プロンプト
> 見積書作成ツールを 1 ファイル HTML で作って。
>
> 入力: 発行日 / 宛先(会社名・担当者・敬称) / 件名 /
> 品目テーブル(品名・数量・単価、行追加削除可) / 備考
> 自動計算: 行金額 / 小計 / 消費税(10% / 8%)/ 合計
> 操作:
> - 印刷プレビューで A4 縦に切替、@media print で装飾を消す
> - 下書き保存 / 読込 (localStorage)
> - 過去宛先のサジェスト
> 制約:
> - Tailwind CDN、PC 中心で OK
> - 自社情報は HTML 上部の変数として==@media print== を必ず指定するのが社内ツール特有のコツ。「印刷時は入力フォームを隠して見積書ブロックだけ表示」の挙動が出ます。
Step 3 — 確認ポイント
- 行を 5 つ追加・削除しても小計と税が正しい
- 数量や単価を空にしたとき
NaNが出ない - 印刷プレビューが A4 1 枚に収まる
- リロード後も下書きが復元される
- 計算結果を手で 1 件は検算 する(絶対)
社内ツールでは自動計算を必ず手で 1 件検算 すること。LP は見た目がおかしくても翌日直せますが、社内ツールの間違った数字は取引先に直接届きます。ここだけは Claude Code を信用しすぎない。
Step 4 — 改善ラウンド
> 以下の改善を加えて。
> 1. 過去宛先一覧(localStorage 蓄積)をドロップダウン化
> 2. 最近使った品目 5 件をチップ表示、クリックで行追加
> 3. 見積番号 "Q-YYYYMMDD-連番" を自動採番
> 4. 有効期限(発行日 + 30 日デフォルト)
> 5. 必須項目チェック — 未入力なら印刷ボタン非活性1 回の指示で 3〜5 個まで が安全。それ以上は劣化します。
完成した mitsumori.html を 共有フォルダ(Drive / NAS / SharePoint) にコピーして配布完了。ダブルクリックで動く のが HTML 単体の最大の強み。
実例 2 — 問い合わせ管理ツール(CRUD + DB)
「複数人で同時編集する」前提の CRUD ツール。データを DB に置くのが大きな違いです。
CRUD の 4 操作
| 操作 | 画面 | API |
|---|---|---|
| Create | 新規登録 | POST /tickets |
| Read | 一覧 + 詳細 | GET /tickets |
| Update | 編集 | PATCH /tickets/:id |
| Delete | 削除 + 確認 | DELETE /tickets/:id |
「画面 4 つ + API 4 つ」を 1 セットで作るのが定型。これが体に染みつくと、どの管理ツールも 2 時間で立ち上がります。
Claude Code への初回プロンプト
> 問い合わせ管理ツールを React Router v7 で作って。
>
> データモデル (tickets):
> id / subject / from_name / from_email / body /
> status (open/in_progress/resolved/closed) /
> assignee / priority (low/normal/high) /
> created_at / updated_at
>
> 画面 4 つ:
> /tickets 一覧(status/assignee/priority フィルタ + 検索)
> /tickets/new 新規
> /tickets/:id 詳細 + コメントタイムライン
> /tickets/:id/edit 編集
>
> 機能:
> - 一覧からステータス変更ワンクリック
> - 担当割当ドロップダウン
> - 対応コメント追記
>
> 技術:
> - React Router v7、Tailwind
> - SQLite + Drizzle(./data/tickets.db)
> - loader/action で DB を触る、認証は後で追加データモデルと画面数を最初に明示 するのが CRUD でブレない最大のコツ。「問い合わせ管理を作って」だけだと毎回出力がバラバラになります。
追加要求の典型
> 以下を追加して。
> 1. CSV エクスポート — 現在の絞り込みで出力
> 2. CSV インポート — 既存 Excel から取り込み
> 3. Slack 通知 — 新規 + high 優先度変更時
> 4. 一括ステータス変更 — チェックボックスで複数選択
> 5. ダッシュボード — 担当別・ステータス別件数CRUD ツールは 1 つ作ると 10 個作れる。問い合わせ管理ができれば、案件・顧客・商品管理は フィールド名差し替えだけ で完成。1 つ目に時間をかけて骨格を整える価値があります。
認証・データ保存の最小設計
社内ツールで一番つまずくのが 認証 と データ保存。軽く扱うと半年後に事故になります。
データ保存の 3 段階
| 段階 | 保存先 | 適用範囲 |
|---|---|---|
| Lv.1 | localStorage | 個人ツール |
| Lv.2 | SQLite ファイル | 単一サーバ |
| Lv.3 | マネージド DB(Neon / TiDB Serverless) | 本番運用 |
Lv.1 → Lv.3 のジャンプは必ず発生 するので、初めから ORM(Drizzle / Prisma)を入れておけば DB 移行は 30 分で終わります。
認証の 3 段階
| 段階 | 方式 | 適用範囲 |
|---|---|---|
| Lv.1 | 無し | 自分だけ |
| Lv.2 | Basic 認証 | 数人共有 |
| Lv.3 | SSO(Google / Microsoft) | 部署横断 |
本番デプロイするなら最低 Basic 認証。「社内 IP からしかアクセスできない」は危険な思い込みです(VPN・退職者問題)。
監査ログは必須
誰が何を変えたか を追えないとトラブル時に原因究明できません。
> operations ログテーブルを追加。
> id / operation / target_id / actor / changed_at / diff(JSON)
> すべての mutation で自動記録、詳細画面に変更履歴を表示3 ヶ月後の「誰が消したの」がゼロ秒で解決します。
デプロイか、ローカル運用か
パターン A — ローカル運用(共有フォルダ配布)
HTML 単体を Drive / OneDrive / NAS に置く運用。
向く: 個人ツール、ネット遮断環境、今日中に配りたい 向かない: 同時編集、データ集約、履歴・監査
パターン B — サーバ運用
React Router / Next.js を Vercel / Cloudflare Pages / Cloud Run にデプロイし、社内 URL で公開。
向く: 複数人同時編集、データ集約、履歴・監査、スマホ対応 向かない: ユーザーが 1 人
初手の判断
「同時に編集する瞬間が 1 度でもあるか」 を自問。1 度でもあるなら最初からサーバ運用で。「とりあえずローカル」で始めると、必ず 後でデータ統合の地獄 が待っています。
失敗パターン
社内ツール固有の地雷 8 つ。
- 機能盛りすぎ — まず 1 機能だけ配って、使いながら追加が鉄則
- セキュリティ無視 — Basic 認証 1 つで 99% のリスクは消える
- メンテ放棄 — README + CLAUDE.md + チーム共有リポジトリ + 環境変数ドキュメント化
- バックアップなし — 週次ダンプ Cron を最初から仕込む
- エラー無視 — エラー時に Slack 通知
- Excel との二重管理 — CSV インポート/エクスポートで「戻れる安心感」を担保しつつ移行期限を切る
- 同時編集の衝突 —
updated_at楽観的ロックで防げる - モバイル対応忘れ — 外回りの営業がスマホから見たがる
Claude Code 自身が引き継ぎ資料を書ける ので、これは使わない手はありません。
> このプロジェクトの README.md を書いて。
> - 目的 / セットアップ / データモデル / 改修パターン
> - 環境変数一覧 / デプロイ手順
> 別の人が初見 30 分で立ち上げられるレベルに。社内ツール失敗の典型サイン
- README が無い、または「とりあえず動かしてください」しかない
- 認証が無いか
admin / adminのままデプロイ - バックアップが「気が向いたらエクスポート」運用
- 作った人が異動して、誰も改修できないまま半年放置
プロンプトテンプレート 3 つ
コピペで使える業務別プロンプト。
テンプレート 1 — 帳票生成(HTML 単体)
> [帳票名] を 1 ファイル HTML で作って。
> 入力: [ヘッダ項目] / 明細テーブル / 備考
> 自動計算: 小計 / 税 / 合計 / [独自ロジック]
> 操作: 印刷プレビュー(@media print, [用紙サイズ]) /
> 下書き保存読込(localStorage) / 過去入力サジェスト
> Tailwind CDN、自社情報は変数化、PC 表示中心テンプレート 2 — CRUD 管理(React Router)
> [対象データ] 管理ツールを React Router v7 で。
> モデル: id / [フィールド] / status(enum) / created_at / updated_at
> 画面 4 つ: /[resource] (一覧) / new / :id / :id/edit
> CSV エクスポート/インポート、監査ログ
> SQLite + Drizzle(後で Neon に移行できる構造)
> Basic 認証(環境変数 BASIC_USER/BASIC_PASS)
> 全 mutation で operations に自動ログテンプレート 3 — 集計レポート(Streamlit)
> [対象データ] の集計レポートを Streamlit で。
> データソース: [CSV / API / DB]
> サイドバー: 期間フィルタ / [カテゴリ] 複数選択
> メイン: KPI カード 3 枚 / 月次推移折れ線 /
> [カテゴリ] 別棒グラフ / 明細テーブル
> CSV ダウンロード、@st.cache_data でキャッシュテンプレ運用のコツ
3 テンプレを ==CLAUDE.md に貼り付け ておくと、「テンプレ 2 で従業員管理ツール作って==」の一行で呼び出せます。社内ツールは似た形が無限に発生するので、テンプレ運用の効果は LP 以上です。
自分以外の人に使ってもらう工夫
社内ツールを他人に渡すなら、次の手当てでサポートコストが激減します。
- フィールド名は業務用語 —
statusではなく「対応状況」、assigneeではなく「担当者」 - 空状態の説明 — 「データがありません」ではなく「右上の "新規登録" から追加してください」
- エラーメッセージを優しく —
Validation failedではなく「メールアドレスを入力してください」 - キーボードショートカット —
/で検索、nで新規、Escで閉じる、Cmd+Sで保存 - 操作の取り消し — 削除直後に「元に戻す」を 5 秒表示
社内ツールの UX は「自分が触っていて不快な箇所をゼロにする」 だけで 80 点に到達します。LP のように見た目に振る必要はありません。代わりに 1 日 50 回触る人の親指の疲れ を 1mm でも減らす設計が効きます。
このレッスンのまとめ
- 評価軸は 「削った業務時間」の 1 点。見た目より使い勝手
- ユースケースは 帳票 / CRUD / 集計 / API ラッパー / ルール判定 の 5 つ
- スタックは 同時編集の有無 で決める。1 人なら HTML、複数人なら React Router + DB
- 実例 1(見積書)は HTML 単体、実例 2(問い合わせ管理)は CRUD + DB
- 認証・データ保存は Lv.1 → Lv.3 を意識、本番では最低 Basic 認証 + 監査ログ
- 共有フォルダ vs サーバ運用 は「同時編集 1 度でもあるか」で判断
- 失敗パターンは 機能盛りすぎ / セキュリティ無視 / メンテ放棄 の 3 大トップを最優先で潰す
- 業務別 プロンプトテンプレ 3 種 を
CLAUDE.mdにストック
章末演習 — 必ず 1 つ手を動かしてください。所要 30〜60 分。
- 自分の業務で 「Excel でやってるけど不便」 な作業を 1 つ挙げる
- 5 ユースケース(帳票 / CRUD / 集計 / API ラッパー / ルール判定)のどれか分類する
- 同時編集の有無 でスタックを決める
- 該当する プロンプトテンプレ を選び、フィールド名を差し替えて Claude Code に投げる
- 同僚 1 人に触ってもらい、最初の 5 分で迷ったところを 1 つ修正する
<Quiz question="社内ツール開発で「最初に判断すべき」項目はどれ?" options={["同時編集が必要かどうか(HTML 単体か、DB 付きサーバ運用か)","色を青系にするかオレンジ系にするか","Tailwind のバージョンを最新にするか"]} answer={0} />
<Quiz question="問い合わせ管理ツールのような CRUD アプリで必須な「4 操作」とは?" options={["Create / Read / Update / Delete","Login / Logout / Search / Export","Create / Print / Send / Archive"]} answer={0} />
<Quiz question="社内ツールがメンテ放棄される最大の防止策はどれ?" options={["README.md と CLAUDE.md に目的・改修方法・環境変数を書き残す","コードを最新フレームワークで書き直し続ける","作った人が会社に居続ける"]} answer={0} />
次のレッスン 6-3: Vercel 公開 では、ここで作ったツールを 社内に公開 する手順を学びます。GitHub にプッシュして Vercel に繋ぐだけで、https://tools.example-corp.jp のような URL で社内全員が触れる状態を作ります。