厳密モード(strict)でツール入力を型どおりにする

Claude.ai エンジニアリング 6分で読めます

ツール定義に strict: true を付けると、Claude が返すツール入力が JSON Schema に必ず一致することが保証されます。公式ドキュメント Strict tool use をもとに、何が保証されるのか、どう書くのか、そして使えない相手とスキーマの取り扱いの注意を整理します。

strictは何を保証するのか

厳密モードが無いとき、Claude はときどき型の合わない値を返します。整数を期待している passengers"2" という文字列が入る、あるいは "two" という語が入る、必須フィールドが欠ける、といったことが起こります。呼び出し側の関数はそれを受け取って落ちます。

strict: true を付けると、この種の食い違いが構造的に起きなくなります。公式は保証される内容を3点で挙げています。

加えて、tool_use ブロックの name も常に有効なツール名になります。つまり「定義していないツール名が返ってくる」ことも無くなります。エージェントのようにツール呼び出しを人が見ずに実行する仕組みでは、この保証の有無が信頼性の差になります。

書き方: strict:true と additionalProperties:false

書き方は単純です。strict はツール定義のトップレベルのプロパティで、name / description / input_schema と同じ階層に置きます。input_schema の中ではありません。

{
  "name": "get_weather",
  "description": "Get the current weather in a given location",
  "strict": true,
  "input_schema": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "The city and state, e.g. San Francisco, CA"
      },
      "unit": {
        "type": "string",
        "enum": ["celsius", "fahrenheit"]
      }
    },
    "required": ["location"],
    "additionalProperties": false
  }
}

スキーマ側では additionalProperties: false を併せて指定するのが公式の例です。enum で値を絞り込む書き方もそのまま効きます。たとえば "passengers": {"type": "integer", "enum": [1,2,3,4,5,6,7,8,9,10]} のように書けば、整数であることに加えて範囲まで縛れます。

仕組み: 文法で束縛したサンプリング

仕組みは文法で束縛したサンプリング(grammar-constrained sampling)です。スキーマからそのスキーマだけを受け付ける文法を作り、モデルがトークンを選ぶ段階でスキーマに合わない出力を選べなくします。生成したあとに検証して弾いているのではなく、そもそも外れた出力が生成されません。

手順としては3段です。

  1. input_schema を JSON Schema で書く。使える構文には制限があるので、構造化出力の「JSON Schema の制限」と同じ範囲に収める
  2. ツール定義に "strict": true を足す
  3. 返ってきた tool_useinput をそのまま使う。スキーマに一致していることは保証済み

構造化出力と同じパイプラインを使っているので、両者の JSON Schema の扱いは共通です。片方で通るスキーマは、もう片方でも通ります。

使いどころと使えない相手

公式が挙げている使いどころは4つです。ツールのパラメータを検証したいとき、エージェント的なワークフローを組むとき、型安全な関数呼び出しが必要なとき、入れ子の深い複雑なツールを扱うときです。

逆に、使えない相手が明示されています。computer use と browser use のツールセット項目(computer_toolset_20260801browser_toolset_20260801)は strict: true を受け付けません。どちらかにこれを付けたリクエストは拒否されます。この2つを含む構成では、他のツールにだけ付けてください。

また、厳密モードは「入力が型どおりになる」ことしか保証しません。値の中身が正しいかどうかは別の話です。存在しない都市名が string として渡ってくることは依然ありえます。業務上の妥当性検査は自分の関数の中に残しておく必要があります。

スキーマの取り扱いとPHIの注意

厳密モードはツールの input_schema を文法にコンパイルします。このコンパイル済みスキーマは最終利用から最大24時間キャッシュされます。プロンプトと応答自体は API の応答を超えて保持されません。

ここに実務上の注意が1つあります。厳密モードは HIPAA の対象として利用できますが、保護対象保健情報(PHI)をツールスキーマの定義に入れてはいけません。API はコンパイル済みスキーマをメッセージ本文とは別に保管しており、キャッシュされたスキーマはプロンプトや応答と同じ保護を受けません

具体的には、次の場所に PHI を書かないでください。

PHI が現れてよいのはメッセージ本文(プロンプトと応答)だけで、そこは HIPAA の保護の対象です。スキーマは「構造の定義」であって「データの置き場」ではない、と考えると間違えにくくなります。