AI Agent · Function Calling

2026 Function Calling とは?OpenAI・Gemini・Claude が JSON で API と外部ツールを呼ぶ仕組み

2026.08.18 · 約 12 分

分水嶺は「どのモデルが賢いか」ではなく、誰が JSON を出し、誰が副作用を実行するかです。プロトコル、3 社の JSON、ランタイム境界、選定マトリクスと 7 ステップをまとめます。

JSON エディタと工具が並ぶ開発デスク—Function Calling で外部 API に接続するイメージ

Function Calling(ツール呼び出し)は 2026 年の Agent の標準プロトコルです。モデルは散文で API を「呼んだふり」をするのではなく、合意した schema の JSON を出力し、あなたのコードが天気取得・DB 照会・ファイル編集・テスト実行を行います。差は会話の上手さではなく、schema 検証・実行監査・副作用の隔離です。

最終更新 2026年8月18日。SDK のフィールド名は変わりますが、ループは変わりません。ディスクを変えるツールは Agent ファイルシステムのサンドボックスとセットで。セッションを跨ぐ設定は次の arguments ではなく Memory 層へ。

3
ベンダー JSON 方言
1
共通ループ
MCP
発見とトランスポート

なぜ自由文プロンプトでは足りないのか(Why)

かつては「get_weather(city=北京) を呼んで」と書いて正規表現で抽出しました。デモは通り、本番では三つ壊れます。

  1. パースが不安定——挨拶や引数順の入れ替え、引用符漏れで JSON.parse が死ぬ。
  2. 型がない——enum が自由記述になり、必須が消え、並列呼び出しの対応が取れない。
  3. 副作用とチャットが混ざる——モデルは削除したと主張するが未実行、あるいは実行したが結果が戻らない。

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 toolsChat Completions / Responsesあなたが実行。arguments はしばしば JSON 文字列並列 tool_calls[]、strict schema 任意既存 OpenAI SDK・互換ゲートウェイ
Gemini functionDeclarationsGemini API / Vertexあなたが実行。toolConfig.mode で強制/禁止型名は大文字 OBJECT/STRING が多いGCP、モード切替が要る製品
Claude tool_useMessages API / Claude Codeあなたが実行。input は既にオブジェクトcontent ブロック:tool_use / tool_resultAnthropic、IDE Agent、MCP
MCP ツールクライアント ↔ MCP サーバサーバプロセス内。モデルは JSON のみ実行時にツール一覧を発見カタログのホットプラグ

2026 年の分水嶺は「対応しているか」(三社とも対応)ではなく、引数が文字列かオブジェクトか、並列の揃え方、失敗の書き戻しです。ゲートウェイは内部 ToolCall{name, id, args} に正規化して一つの L2 に渡します。

三社の JSON(How)

同じ get_weather。本番の description には境界を書いてください(公開気象のみ、個人位置は禁止)。

OpenAI: tools + tool_calls

リクエストに tools を付けます。呼び出し時は tool_callsarguments文字列化された 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 に宣言。型は大文字が多い。modeAUTO / 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 / VertexGemini + mode翻訳が少ない。「このターンは検索必須」に向く
Claude Code 中心Claude tools + MCPIDE のツールカタログと一致
三社モデルを同時接続内部 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 禁止。

よくある誤解

  1. モデルが認証すると信じる——キーはランタイム。
  2. OpenAI の arguments をオブジェクトとして扱う——先に parse。
  3. 説明が「何でも屋」——過剰呼び出し。
  4. 並列 tool_calls を無視——書き込みは直列化。
  5. 失敗を握りつぶす——構造化エラーを返す。
  6. MCP = 安全——ホームディレクトリ root は全ディスク。

導入 7 ステップ

  1. ツール棚卸し(副作用・タイムアウト・データ所在)。
  2. JSON Schema(必須、enum、additionalProperties 禁止)。
  3. 最小ループ(単一ツール)。
  4. 検証と秘密の隔離、監査。
  5. 二社目 adapter で内部モデルを証明。
  6. 書き込みツールをサンドボックス化。
  7. 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 へ。料金を先に確認してください。

関連記事

ツール実行は隔離された Cloud Mac ノードへ

天気照会はサーバーレスで足りる一方、リポジトリ編集・テスト・社内 API は破棄可能な実行ホストが必要です。リモート Mac はセッション単位でワークスペースを隔離します。

今すぐ注文 · 料金

Function Calling

ツール実行は隔離された Cloud Mac ノードへ

M4 · Cloud Mac · isolated tool runtime

今すぐ注文