GEMINI LABEN
MCPCONN — Gemini in Google Workspace が Asana・Atlassian Rovo・HubSpot・Mailchimp・QuickBooks・Monday・Salesforce と MCP で接続されました。既定は ON で、管理コンソール側で切り替えますGLOBAL — Gmail 検索の AI Overviews の「グローバル提供」には条件が付いています。表示言語が英語であることと、個人アカウントでは日本が除外されていることが原文に書かれています10/02 — gemini-2.5-flash-image が10月2日に止まります。残り10日。置き換え先は gemini-3.1-flash-image-preview です402 — プリペイド残高が尽きたときの応答が 429 から HTTP 402 に変わりました。status は RESOURCE_EXHAUSTED のままですので、status で分岐している再試行は止まりませんNEW — つないだ MCP を初めて外した日 — 常時有効にするツールを選ぶ基準SKILLS — Gems の終了と Skills への移行がアプリ内で案内されています。仕事や学校のアカウントでは Skills を使えないとされており、日付はまだ公式に確認できていませんMCPCONN — Gemini in Google Workspace が Asana・Atlassian Rovo・HubSpot・Mailchimp・QuickBooks・Monday・Salesforce と MCP で接続されました。既定は ON で、管理コンソール側で切り替えますGLOBAL — Gmail 検索の AI Overviews の「グローバル提供」には条件が付いています。表示言語が英語であることと、個人アカウントでは日本が除外されていることが原文に書かれています10/02 — gemini-2.5-flash-image が10月2日に止まります。残り10日。置き換え先は gemini-3.1-flash-image-preview です402 — プリペイド残高が尽きたときの応答が 429 から HTTP 402 に変わりました。status は RESOURCE_EXHAUSTED のままですので、status で分岐している再試行は止まりませんNEW — つないだ MCP を初めて外した日 — 常時有効にするツールを選ぶ基準SKILLS — Gems の終了と Skills への移行がアプリ内で案内されています。仕事や学校のアカウントでは Skills を使えないとされており、日付はまだ公式に確認できていません
記事一覧/API / SDK
API / SDK/2026-09-22上級

関数呼び出しが平文に化けるとき、まず疑うのはツール宣言のプロパティ名です

MALFORMED_FUNCTION_CALL を出力上限とスキーマ衝突で潰しきれなかったとき、ツール宣言のプロパティ名を二分探索で絞り込んだ記録です。予約語を名前に置かない線引きと、宣言の手前で落とすリンタまで書き残します。

Gemini API240function calling4MALFORMED_FUNCTION_CALLスキーマ設計2Python48

プレミアム記事

浮世絵壁紙の分類パイプラインにツールを 1 本足した翌朝、前の晩まで通っていた呼び出しが finishReason: MALFORMED_FUNCTION_CALL で返ってきておりました。足したのは色の分布を返すだけの小さなツールで、既存の宣言には指一本触れておりません。

最初に疑ったのは出力トークンの上限でした。次に、スキーマと自然言語の指示の衝突です。どちらも外れました——上限を倍にしても、指示文を空にしても、同じところで関数呼び出しが平文へ化けます。

行き着いたのは、足したツールの説明文でも引数の型でもなく、そのツールが持っていたプロパティの名前でした。ひと文字の接尾辞を足すだけで、その晩のうちに止まりました。同じ袋小路に入っている方のために、絞り込みの手順と、私が引いた線引きを書き残します。

返ってきていたのは、エラーではなく平文でした

MALFORMED_FUNCTION_CALL は HTTP のエラーではありません。ステータスは 200 で返り、レスポンスの中身だけが壊れています。ここが切り分けを遅らせました。

実際に返ってきていたのは、こういう形です。

{
  "candidates": [
    {
      "content": {
        "parts": [
          { "text": "print(default_api.classify_palette(in=\"新着/2026-09/ukiyoe-0431.jpg\"))" }
        ],
        "role": "model"
      },
      "finishReason": "MALFORMED_FUNCTION_CALL"
    }
  ]
}

partsfunctionCall がありません。代わりに、関数呼び出しを文字で書いたものtext として入っています。モデルはツールを呼ぼうとして、呼び出しの形を組み立てきれず、途中で文章の側へ落ちたのです。

大事なのは、落ちたのが classify_palette だけではなかったことでした。同じターンで呼ばれるはずだった別の 2 本も、そろって平文になっていました。1 本の宣言の問題が、そのターン全体を巻き込みます。

壊れているのが 1 本なのに、症状は全部に出ます。だから「最後に足したツール」から疑うと外れます。

出力上限とスキーマ衝突は、先に外せます

名前を疑う前に、よく知られた 2 つの原因を落としておきます。どちらも数分で外せますので、順番を飛ばさないほうが結局は早く済みます。

上限を疑うとき

maxOutputTokens を十分に大きくして、同じ入力をもう一度投げます。上限が原因なら、ここで STOP に戻ります。戻らなければ上限は無関係です。思考予算を使うモデルでは、思考の分も同じ枠から引かれますので、余裕を持たせた値で試します。

指示文を疑うとき

システム指示とユーザー入力から、出力の形を縛る文(JSON で返せ、コードブロックで包め、といった類い)を一時的に外します。構造化出力とツール宣言の同時指定は、組み合わせによっては噛み合いません。この層の話は responseSchema の enum 指定なのに違う文字列が返る — Gemini API で起きる原因と回避策 に書いた内容と地続きです。

私はこの 2 つを外した時点で、原因が宣言そのものにあると腹をくくりました。ここから先が、この記事の本題です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
9 本あるツール宣言のどれが原因かを、当てずっぽうではなく 4 回の API 呼び出しで 1 本まで絞り込めるようになります
スキーマの名前に置かない語をあらかじめ決められるので、これまで動いていた実装がツールを 1 本足した日に壊れる事故を、起きる前に避けられるようになります
MALFORMED_FUNCTION_CALL を「たまに出るもの」で済ませず、出力上限・指示文の衝突・宣言の名前という三つの層に切り分けて潰せるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-09-12
10月2日に止まる gemini-2.5-flash-image の移行先は、公式表のままでは動きません
gemini-2.5-flash-image の停止は2026年10月2日です。ところが公式の推奨移行先として書かれている gemini-3.1-flash-image-preview は6月25日に停止済みでした。移行先を最後まで辿るスクリプトを書いて表の全行を検査し、同じ構造の行が11件あることを確かめた記録です。
API / SDK2026-09-07
Lyria 3.5 が来た日に、音源フォルダの置き方を変えました
Lyria 3.5 のフルレングス生成が来たとき、生成した音と配信する音が同じフォルダに並んでいました。名前ではなくハッシュで線を引く、四十数行の台帳ゲートの作り方をお伝えします。
API / SDK2026-08-27
Gemini に渡す前に表が壊れる場所は結合セルと2行ヘッダ
スプレッドシートの表をそのまま Gemini に渡すと、結合セルと2行ヘッダで行の所属が失われます。抽出時点で何が消えるかを実測し、平坦化と集計行の検出までを Python で組みます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます