Function Calling(ツール呼び出し)は 2026 年の Agent の標準プロトコルです。モデルは散文で API を「呼んだふり」をするのではなく、合意した schema の JSON を出力し、あなたのコードが天気取得・DB 照会・ファイル編集・テスト実行を行います。差は会話の上手さではなく、schema 検証・実行監査・副作用の隔離です。
最終更新 2026年8月18日。SDK のフィールド名は変わりますが、ループは変わりません。ディスクを変えるツールは Agent ファイルシステムのサンドボックスとセットで。セッションを跨ぐ設定は次の arguments ではなく Memory 層へ。
なぜ自由文プロンプトでは足りないのか(Why)
かつては「get_weather(city=北京) を呼んで」と書いて正規表現で抽出しました。デモは通り、本番では三つ壊れます。
- パースが不安定——挨拶や引数順の入れ替え、引用符漏れで JSON.parse が死ぬ。
- 型がない——enum が自由記述になり、必須が消え、並列呼び出しの対応が取れない。
- 副作用とチャットが混ざる——モデルは削除したと主張するが未実行、あるいは実行したが結果が戻らない。
Function Calling は選択をモデルに、実行をランタイムに残します。HTTP / SQL / shell はモデルプロセス内では起きません。CI と同じく、賢さより実行境界が先です。
Function Calling の三層(What)
「OpenAI tools を付けた」はアーキテクチャではありません。最低三層に分けます。
| 層 | 役割 | 典型 | 所有者 |
|---|---|---|---|
| L1 Schema | 名前、JSON Schema、説明、必須 | OpenAI tools[].function、Gemini functionDeclarations、Claude input_schema | プロダクト |
| L2 Runtime | 検証、秘密注入、タイムアウト、監査 | 自前ループ、LangGraph、Claude Code | バックエンド / ローカル Agent |
| L3 Transport | ツールプロセスの発見と接続 | HTTP、MCP stdio/SSE、内部 RPC | インフラ |
非対称な結論:ベンダー API が標準化するのは L1 の JSON 封筒だけです。L2 の認可と L3 のプロセス隔離は自分でやる。MCP は発見とセッションであり、自動安全ではありません。
ループは次の通り。モデルは API キーを持ちません。秘密はランタイムだけにあります。
┌──────────────┐ JSON tool request ┌──────────────────┐
│ LLM API │ ────────────────────────► │ Your runtime │
│ (OpenAI / │ name + arguments │ (Agent loop) │
│ Gemini / │ │ │
│ Claude) │ ◄──────────────────────── │ execute tool │
└──────────────┘ tool result JSON │ • HTTP APIs │
│ • DB / search │
│ • shell / MCP │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Policy + secrets │
│ allowlist, audit │
│ Cloud Mac / VPC │
└──────────────────┘比較:OpenAI vs Gemini vs Claude
| 面 | 入口 | 実行 | コンテキスト | 向いている人 |
|---|---|---|---|---|
| OpenAI tools | Chat Completions / Responses | あなたが実行。arguments はしばしば JSON 文字列 | 並列 tool_calls[]、strict schema 任意 | 既存 OpenAI SDK・互換ゲートウェイ |
| Gemini functionDeclarations | Gemini API / Vertex | あなたが実行。toolConfig.mode で強制/禁止 | 型名は大文字 OBJECT/STRING が多い | GCP、モード切替が要る製品 |
| Claude tool_use | Messages API / Claude Code | あなたが実行。input は既にオブジェクト | content ブロック:tool_use / tool_result | Anthropic、IDE Agent、MCP |
| MCP ツール | クライアント ↔ MCP サーバ | サーバプロセス内。モデルは JSON のみ | 実行時にツール一覧を発見 | カタログのホットプラグ |
2026 年の分水嶺は「対応しているか」(三社とも対応)ではなく、引数が文字列かオブジェクトか、並列の揃え方、失敗の書き戻しです。ゲートウェイは内部 ToolCall{name, id, args} に正規化して一つの L2 に渡します。
三社の JSON(How)
同じ get_weather。本番の description には境界を書いてください(公開気象のみ、個人位置は禁止)。
OpenAI: tools + tool_calls
リクエストに tools を付けます。呼び出し時は tool_calls。arguments は文字列化された JSONなので parse してから検証します。
{
"model": "gpt-4.1",
"messages": [{"role": "user", "content": "What's the weather in Beijing?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
}]
}{
"role": "assistant",
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\":\"Beijing\",\"unit\":\"celsius\"}"
}
}]
}実行後、role: tool(または Responses 相当)で tool_call_id を合わせ、結果文字列を返します。
Gemini: functionDeclarations + toolConfig
tools[].functionDeclarations に宣言。型は大文字が多い。mode は AUTO / ANY / NONE。製品スイッチでありサンドボックスではありません。
{
"contents": [{"role": "user", "parts": [{"text": "What's the weather in Beijing?"}]}],
"tools": [{
"functionDeclarations": [{
"name": "get_weather",
"description": "Current weather for a city",
"parameters": {
"type": "OBJECT",
"properties": {
"city": {"type": "STRING"},
"unit": {"type": "STRING", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}]
}],
"toolConfig": {"functionCallingConfig": {"mode": "AUTO"}}
}モデルは functionCall part、あなたは functionResponse。OpenAI とフィールド名を一致させないでください。
Claude: tools + tool_use / tool_result
input_schema を使います。応答は content ブロック配列。input はオブジェクトですが欠落は起こるので検証は必須です。
{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"tools": [{
"name": "get_weather",
"description": "Current weather for a city",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}],
"messages": [{"role": "user", "content": "What's the weather in Beijing?"}]
}{
"role": "assistant",
"content": [{
"type": "tool_use",
"id": "toolu_01XYZ",
"name": "get_weather",
"input": {"city": "Beijing", "unit": "celsius"}
}]
}{
"role": "user",
"content": [{
"type": "tool_result",
"tool_use_id": "toolu_01XYZ",
"content": "{\"temp_c\": 28, \"condition\": \"clear\"}"
}]
}Claude Code / Cursor は MCP を足します。モデルが見るのは JSON Schema 付きツール一覧のまま。トランスポートが変わってもループは同じです。
選び方(マトリクス)
| あなたが… | 選ぶもの | 理由 |
|---|---|---|
| OpenAI 互換ゲートウェイ済み | OpenAI tools 方言に統一 | 生態系が最大。adapter を一度書けばよい |
| 主戦場が GCP / Vertex | Gemini + mode | 翻訳が少ない。「このターンは検索必須」に向く |
| Claude Code 中心 | Claude tools + MCP | IDE のツールカタログと一致 |
| 三社モデルを同時接続 | 内部 ToolCall + 各社 adapter | 業務コードに if-else を散らさない |
| ファイル変更・コマンド実行 | リモート Mac + パス許可リスト | きれいな JSON では誤 rm を止められない |
| 読み取り専用 SaaS のみ | サーバーレス + 秘密管理 | マシン全体は不要。引数の許可は必要 |
推奨スタック
A — 個人最速(半日) 単一モデル、読み取り専用ツール 1–3、JSON Schema で extra 拒否、秘密は環境変数、ログはハッシュのみ。
B — 小チーム本番 内部 ToolCall、ツールごとのタイムアウトと上限、書き込みは Cloud Mac セッション。記憶は Memory に分離。リモート Mac 自動化と同じ破棄規律。
C — 企業 カタログ審査、schema は PR、VPC 内 MCP、無制限 bash 禁止。
よくある誤解
- モデルが認証すると信じる——キーはランタイム。
- OpenAI の
argumentsをオブジェクトとして扱う——先に parse。 - 説明が「何でも屋」——過剰呼び出し。
- 並列 tool_calls を無視——書き込みは直列化。
- 失敗を握りつぶす——構造化エラーを返す。
- MCP = 安全——ホームディレクトリ root は全ディスク。
導入 7 ステップ
- ツール棚卸し(副作用・タイムアウト・データ所在)。
- JSON Schema(必須、enum、additionalProperties 禁止)。
- 最小ループ(単一ツール)。
- 検証と秘密の隔離、監査。
- 二社目 adapter で内部モデルを証明。
- 書き込みツールをサンドボックス化。
- 7 日観測し、誤呼び出しの多い schema を狭める。
FAQ
JSON mode との違いは?
JSON mode は最終回答の形。Function Calling は途中のツール要求で、実行後に複数ターンになります。
モデルは DB に直接行けますか?
ランタイムが任意 SQL ツールを出さない限り不可。モデルは schema に合う引数を提案するだけです。
三社で schema を共有できますか?
コアは共有し、封筒だけ変えます。strict の挙動は回帰テストしてください。
Claude Code のツールは Function Calling ですか?
同じループです。カタログが IDE/MCP から動的に来る点が違います。
ツール結果を長期記憶に入れますか?
生ペイロードは大きいので要約して Memory へ。ヘルプも参照。
まとめ
2026 年の Function Calling は型付き RPCです。三社は JSON 方言。安全は L2 検証と実行ホストの隔離です。write_file が今出たらどのマシンのどのディレクトリに落ちるか答えられなければ、書き込みツールはまだ付けないでください。読み取り API は今日から。コード変更とテストは破棄可能な Cloud Mac へ。料金を先に確認してください。