Claude Code × Medical Application

【Claude Code】Medicare Part D × Text-to-SQL Part0:全体像とハーネス設計

日本語 / English

1. 連載の主題

この連載のテーマは agentic coding です。エージェントが自分で計画し、実行し、結果を検証して次の手を決める。そのループが回る状態を人が先に作り、その中で走らせる進め方を指します。

雰囲気で指示を出し、返ってきたコードを読まずに採用する vibe coding とは、人の仕事が違います。人が渡すのはコードではなく、環境・判断基準・停止条件です。 そのために人が組む道具一式を、この連載では「ハーネス」と呼びます。

医療データのアプリは、ハーネスの組み方を具体的に見せるための題材です。誰でも取れる公開データなら、ガバナンスの議論より先に「何を渡し、どこで止め、どう検証するか」を固められ、その型はそのまま社内データに持ち込めます。

アプリの機能を説明するのはこの Part0 だけです。Part1 以降はハーネスの話に絞ります。

2. 題材のアプリ

2-1. 画面

質問 → Claude が SQL を書いて実行 → 地図と解説が返る
ホーム画面。左に年・州・専門科のフィルタ、中央に質問の入力欄と質問例
「GLP-1 受容体作動薬の州別処方数を 2022→2024 で比較」の結果。州別の地図は Claude が選んだ

2-2. 機能

  • 日本語で聞くと、Claude が SQL を書いて BigQuery で実行し、結果と解釈を返す
  • 表・棒グラフ・折れ線・州別地図・CSV を、言い直すだけで切り替えられる
  • 生成された SQL はいつでも展開・コピーでき、何を集計したかを人が確かめられる
生成された SQL を展開したところ

2-3. 構成

アプリの構成 — データは BigQuery、SQL は Claude が書く

Claude には「SQL の実行」と「グラフ仕様の決定」を別々のツールとして渡しています。SQL をアプリ側で検査してから実行するためです。

3. 題材のデータ

日本の NDB オープンデータと米国の Medicare Part D Prescribers の粒度の違い

米国の公的保険 Medicare の薬剤給付(Part D)を、処方医 × 薬剤ごとに年次集計して医師名付きで公開したデータです。3年分で約 8,000万行あり、CSV で誰でも取得できます。日本の NDB オープンデータにはない粒度で、請求ベース・集計済み・少数セルの抑制ありという、実務の RWD に近い構造を持っています。

制度とデータ構造の詳細は、データ説明ページ「Medicare Part D」に分けてあります。

4. ハーネスの全体像

ハーネスの全体像 — 人が組む6つの道具と、それぞれの置き場所
道具 役割 このリポジトリでの実体
プロジェクト文書 作業の順序・制約・用語の正本 CLAUDE.md、docs/design.md・data_dictionary.md・DECISIONS.md・HARNESS.md
権限と停止条件 どのコマンドを通し、どれを人が確認し、どれを拒否するか .claude/settings.json(allow / ask / deny)
MCP 外部システムをエージェントの道具として接続する .mcp.json:BigQuery を読み取り専用で接続
skill 繰り返す手順を、呼び出せる形で持たせる .claude/skills/ の7本
hook 検査を、人が覚えていなくても走らせる .claude/hooks/ の3本
評価 正解のある問いで成果物を測る 精度評価30問、ガードの単体テスト50ケース
.claude/
├── settings.json        権限(allow / ask / deny)と hook の登録
├── skills/
│   ├── cms-csv-to-bigquery/   CSV の取得から BigQuery 投入まで
│   ├── verify-data/           投入結果の検証(MCP だけで動く)
│   ├── display-check/         数値の表示崩れの点検
│   ├── guard-glossary-update/ 失敗した質問から辞書・ガードを直す
│   ├── eval/                  精度評価と記録(人だけが起動)
│   ├── deploy/                Cloud Run への公開(人だけが起動)
│   └── sync-public/           公開リポジトリへの同期(人だけが起動)
└── hooks/
    ├── billing_gate.py        --plan を見ていない投入を止める
    └── post_edit_checks.py    編集後にテスト・ruff・tsc
.mcp.json                    BigQuery MCP の接続

skill には、Claude が状況を見て自分で呼べるものと、人だけが起動できるものがあります。課金が発生する評価・公開・外部への同期は後者にしました。どの道具に何を任せ、どこで人が止めるかを決めることが、ハーネス設計の中身です。

5. ハーネスが肩代わりする工程

ハーネスがなくても、CLAUDE.md に「課金が出るコマンドは実行前に見せること」と書いておけば、エージェントはおおむね従います。ただしそれは文章の約束で、守られたかどうかは人が毎回目で確かめるしかありません。確認・検証・手順の記憶が、全部人の手に残ります。

文書だけで任せたときに人が毎回やる工程と、それを肩代わりする道具
文書だけのとき、人がやること 肩代わりする道具
課金が出るコマンドを、実行前に目で確認する 権限の ask。投入は hook が「直前に --plan を見たか」まで確かめる
.env や鍵を読ませないよう気を配る 権限の deny
投入後の行数・型を BigQuery コンソールで見て貼る 読み取り専用の BigQuery MCP と /verify-data
「テスト回して」「tsc 通して」と毎回指示する 編集後に自動で走る hook
投入・評価・公開の手順を、過去の記録から思い出す skill 7本

ハーネスを組むと、文章の約束は設定による強制に、人の記憶は呼び出せる手順に置き換わります。人に残るのは、ask で止まったところの判断と、評価結果の読み取りです。各 Part では、道具ごとに「ないとき人が何をするか/あると何が消えるか」を並べてお見せします。

6. 連載の構成

Part タイトル ハーネスの主題 題材
0 全体像とハーネス設計(本記事) 全体像 アプリとデータの紹介
1 環境設定と MCP 権限(allow / ask / deny)、BigQuery MCP データ取得と BigQuery 投入
2 プロジェクト文書と skill CLAUDE.md の書き方、skill にする手順の選び方 SQL 生成とツール分離
3 プロンプト設計と hook 指示の境界条件、hook による強制 UI 実装と表示崩れ
4 評価と運用 評価セット、改善ループ、記録 30問評価・モデル比較・Cloud Run(任意)

各 Part では毎回、走らせる前に人が用意したもの/指示に入れた境界条件/人が決めたことと実行が見つけたことの3点を、実際の画面と一緒に書きます。

7. 配布方針

アプリは常時公開せず、コード一式を GitHub で公開します(MIT)。読者は clone して、自分の Anthropic API キーと自分の Google Cloud プロジェクトで動かします。.claude/ と .mcp.json もリポジトリに含めてあるので、Claude Code で開けば同じハーネスで作業できます。有効にする手順は README にあります。

8. まとめ

この連載の主題は agentic coding で、医療データのアプリは題材です。第1作では、文書・権限・MCP・skill・hook・評価の6つを組み、人が繰り返す確認と手順をハーネスに肩代わりさせました。任せられる範囲は、事前にどれだけ検証可能にしておいたかで決まります。

次のステップ

Part1 では、作業環境を整えます。.claude/settings.json で「確認なしで通すもの/人が確認するもの/拒否するもの」を分け、BigQuery を読み取り専用の MCP でつなぎます。題材は、CMS の CSV を取得して BigQuery に載せる工程です。投入の結果を、人ではなくエージェント自身が MCP で確かめるところまでをお見せします。

出典

  • CMS, Medicare Part D Prescribers (data.cms.gov)
  • CMS, Medicare Part D Prescribers Datasets: A Methodological Overview
  • 厚生労働省, NDB オープンデータ
  • Anthropic, Claude Code Docs(permissions / mcp / skills / hooks)

コードは GitHub で公開しています: github.com/HerzLeben/medicare-partd-text-to-sql