AI技術大全 第4回
MCP と Function Calling の違い MCP サーバーを自作して測った

この記事でわかること
- MCP と Function Calling の役割の違いを実際の JSON で
- MCP 経由と直接の定義で、3 社の道具の選び方は変わったか
- つなぐ所のつまずき 3 つと、道具の定義が増やす入力と費用
確認した環境: @modelcontextprotocol/sdk 1.32.1・zod 4.6.7・Node.js 24.12、モデルは YOBITSUGI AI で Claude Haiku 5.5・GPT-6 Luna・Gemini 3.8 Flash / 2026年10月15日に確認
MCP と Function Calling は、置き換え合う物ではありません。Function Calling はモデルの API の機能で、MCP はアプリと道具をつなぐ決まりです。MCP の道具も、モデルには各社の Function Calling の形で渡ります。公式の SDK で MCP サーバーを自作して 30 の作業で試すと、道具の選び方は 3 社とも、同じ説明文を手で書いた定義と同じ数でした。差が出たのは、つなぐ所(定義の変え方と応答の返し方)と、道具の説明文の短さです。
結果の早見

MCP と Function Calling は、どこが違うのか
Function Calling では、アプリが道具の名前・説明・引数の形(JSON Schema)を依頼に付けて送ると、モデルは「この道具をこの引数で」という印を返し、実行はアプリがします。MCP(Model Context Protocol)では、MCP サーバーが道具の一覧と呼び方を JSON-RPC 2.0 で出し、アプリ(MCP クライアント)が一覧を取って、モデルには Function Calling で渡します。

- 仕様: 現行の版は 2026-07-28 です。道具を「model-controlled」(モデルが見つけて呼ぶ物)と呼び、人が呼び出しを止められるようにすること(SHOULD)を求めています。Anthropic は 2025年12月9日に、MCP を Linux Foundation の Agentic AI Foundation(Anthropic・Block・OpenAI が共同で設立)に寄付しました。
- Claude Code は MCP クライアントの側です(今回はつないでおらず、公式の説明の紹介です)。
claude mcp addで stdio や HTTP の MCP サーバーを足します。道具の出力が 1 万トークンを超えると警告し、上限は既定で 2.5 万トークンです。道具の定義を要るときまで読み込まない Tool search が既定で有効です。
# Claude Code に stdio の MCP サーバーを足す書き方(公式の例と同じ形。今回は試していない)
claude mcp add --transport stdio soramado -- node server.mjs
作った物と測り方
道具 5 つの MCP サーバー
第1回の RAG の精度の記事 の、架空の会社「株式会社ソラマド計測」の社内資料 10 本を使い回しました。社員の名簿(20 人)も架空です。
| 道具 | 中身 | 引数 |
|---|---|---|
| search_docs | 社内資料 10 本(見出しの節 220 個)を、文字の 2 字ずつの組で BM25 で検索し、上位の節を返す | query・top_k(1〜5) |
| lookup_employee | 名簿から、社員番号・部署・役職・雇用区分・内線・メールを返す | employee_id(S- と 4 桁)・name・department(どれか 1 つ以上) |
| calculate | 四則演算の式を計算する。カンマや × は「使えない文字」と返す | expression |
| date_calc | 日付に日数を足す。営業日なら土日と祝日を除く | start_date(YYYY-MM-DD)・days・business_days |
| get_current_date | 今日の日付を返す(同じ条件でくり返せるよう、2026年10月15日(木)に固定) | なし |
公式の TypeScript SDK では、引数の形を zod で書くと、SDK が JSON Schema に変えて一覧に出します。
// server.mjs(要所。道具の中身は tools.mjs)
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import { dateCalc } from "./tools.mjs"; // 日付と日数から結果の日付を返す自作の関数(祝日の表を含むので略)
const server = new McpServer({ name: "soramado-tools", version: "1.0.0" });
server.registerTool("date_calc", {
description: "日付に日数を足し引きして、結果の日付と曜日を返します。…(全文は記事の最後)",
inputSchema: { // zod の形。SDK が JSON Schema に変えて tools/list で出す
start_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).describe("始まりの日(YYYY-MM-DD の形。例: 2026-09-01)"),
days: z.number().int().describe("足す日数(整数。前に戻るときは負の数)"),
business_days: z.boolean().optional().describe("true なら営業日で数える(既定 false)"),
},
}, async (args) => {
try {
return { content: [{ type: "text", text: JSON.stringify(dateCalc(args)) }] };
} catch (e) {
return { content: [{ type: "text", text: e.message }], isError: true }; // 道具の中の誤りは、モデルに返して直させる
}
});
// search_docs・lookup_employee・calculate・get_current_date も同じ形で足す
await server.connect(new StdioServerTransport());
# 動かした版: SDK 1.32.1・zod 4.6.7・Node.js 24.12(ファイルの拡張子は .mjs)
npm install "@modelcontextprotocol/sdk@1.32.1" "zod@4.6.7"
クライアント: 一覧を取り、3 社の形に変える
クライアントはサーバーを子のプロセスとして起動し、tools/list の一覧を 3 社の形に変えます。変えるのは項目の名前だけです。
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const mcp = new Client({ name: "hda-bench", version: "1.0.0" });
await mcp.connect(new StdioClientTransport({ command: "node", args: ["server.mjs"] }));
const { tools } = await mcp.listTools(); // tools/list
const forClaude = tools.map((t) => ({ name: t.name, description: t.description, input_schema: t.inputSchema }));
const forGPT = tools.map((t) => ({ type: "function", name: t.name, description: t.description, parameters: t.inputSchema, strict: false }));
const forGemini = [{ functionDeclarations: tools.map((t) => ({ name: t.name, description: t.description, parametersJsonSchema: t.inputSchema })) }];
// モデルが道具を呼んだら、tools/call で実行して、結果の文字を返す
async function runTool(name, args) {
const r = await mcp.callTool({ name, arguments: args });
return { text: r.content.filter((c) => c.type === "text").map((c) => c.text).join("\n"), isError: !!r.isError };
}
Claude との往復は次のとおりです。callClaude は Messages API に送る関数です(今回は YOBITSUGI AI の中継に送りました)。
const messages = [{ role: "user", content: task }];
for (let round = 0; round < 8; round++) { // 往復は 8 回まで
const res = await callClaude({ model: "claude-haiku-5-5", max_tokens: 2048, system, tools: forClaude, messages });
const calls = res.content.filter((c) => c.type === "tool_use");
if (!calls.length) return res.content.filter((c) => c.type === "text").map((c) => c.text).join("");
messages.push({ role: "assistant", content: res.content }); // 返ってきた中身は、そのまま会話に戻す
const results = [];
for (const c of calls) {
const r = await runTool(c.name, c.input);
results.push({ type: "tool_result", tool_use_id: c.id, content: r.text, ...(r.isError ? { is_error: true } : {}) });
}
messages.push({ role: "user", content: results });
}
// GPT(Responses API): input に res.output を全部足し、{type: "function_call_output", call_id, output} を足す。arguments は JSON の文字列なので JSON.parse する
// Gemini(generateContent): contents に candidates[0].content をそのまま足し(thoughtSignature ごと)、{functionResponse: {name, id, response: {result}}} を足す
(b) の「直接書く」では、同じ説明文と同じ意味の引数の形を各社の形で手で書き、道具はクライアントの中で同じ関数を直接呼びました。引数の確かめも同じ zod の形です。
作業 30 個と数え方
| 種類 | 数 | 例 | 要る道具 |
|---|---|---|---|
| 道具 1 つで済む | 12 | 2026年11月2日から 10 営業日後は何月何日ですか | date_calc |
| 2 つを順に使う | 10 | 社員番号 S-1031 の人が結婚します。特別休暇は何日もらえますか | lookup_employee → search_docs |
| 道具が要らない | 4 | 「MCP」は何の略ですか。英語で答えてください | なし |
| どの道具でも答えられない | 4 | 明日の東京の天気を教えてください | なし(資料に無い育児休業の作業だけ検索が要る) |
2 つを順に使う作業は、名簿で雇用区分や役職を引かないと答えが決まらないように作りました(S-1031 の人は契約社員で、結婚の特別休暇は正社員の 5 日ではなく 3 日)。全文と正解は記事の最後にあります。
- 道具の選び方: 呼んだ道具の種類が、要る道具を全部含み、ほかを含まない作業の数。道具が要らない作業は、呼ばなければ正しい。
- 余計な呼び出し: 要らない道具の呼び出しと、同じ引数のくり返し。引数の誤り: 道具が引数の誤りを返した呼び出しと、決め手の呼び出し(例: date_calc の日付と日数)が一度も正しくならなかった作業。往復: モデルの API を呼んだ回数。
- 答えの正答: 入るべき語(例: 11月17日)で照らしました。言い直しの作業と答えられない作業の 5 つは、編集部(Claude Code を使用)が決まりを決めて読んで判定し(細部は記事の最後)、雇用区分で答えが変わる作業も全部読みました。
- 作業・数え方・プロンプトは、結果を見る前に決めました。あとから足した所は記事の最後に書きました。
モデルと設定
| 項目 | 設定 |
|---|---|
| モデル | Claude Haiku 5.5(Messages API)・GPT-6 Luna(Responses API)・Gemini 3.8 Flash(generateContent)。YOBITSUGI AI の速い段の 3 つ |
| 変えた設定 | Claude は max_tokens が必須なので 2048。GPT は道具に strict: false を書いた(理由は「つまずき」の ②)。ほかは指定しない(tool_choice は auto) |
| 往復の上限 | 1 つの作業で 8 回 |
| 条件 | A: MCP から変えて渡す・詳しい説明 / B: 各社の形で直接書く・詳しい説明 / C: MCP・短い説明 / D: MCP・例入りの説明 |
モデルの名前は、YOBITSUGI AI の記録に残った名前(claude-haiku-5-5・gpt-6-luna・gemini-3.8-flash)で確かめました。
MCP の実際のやり取り

- SDK 1.32.1 は、2025-11-25 版の手順(initialize → notifications/initialized → tools/list)で話しました。この SDK が知っている最新の版が 2025-11-25 です。現行の 2026-07-28 版では最初のあいさつが無くなり、毎回の依頼の
_metaに版を書きます。tools/list と tools/call の名前はそのままで、結果に resultType などの項目が足されました。 - 形の違う引数は、SDK が zod の形で確かめ、
isError: trueの結果として返しました。仕様も、引数の形の誤りは道具の結果として返し、クライアントはそれをモデルに渡して直させること(SHOULD)としています。
MCP 経由と直接の定義で、結果は変わったか

- 選び方と答えは、A と B でほぼ同じでした。 選び方は 3 社とも同じ数、答えの正答の差は GPT-6 Luna の 1 件だけです。Gemini 3.8 Flash の外れは A・B とも同じ 2 つでした。Claude Haiku 5.5 は暗算した作業が A と B で入れ替わり(答えは合っていた)、同じ定義でもこの程度は変わります。
- MCP の定義は、少しだけ入力が多くなりました。 SDK が JSON Schema に変えるときに足す
$schemaと整数の上限・下限(±9,007,199,254,740,991)などの分で、道具 5 つで Claude +162・GPT +37・Gemini +62 トークンでした。
編集部の見立てでは、選び方を決めるのは説明文と引数の形で、MCP を通すかどうかではありません。MCP の意味は、同じ道具を Claude Code などほかのアプリからも使えることと、道具を別のプログラムに分けられることにあります。
3 社の呼び出しの形

印は Claude が tool_use、GPT が function_call、Gemini が functionCall で、GPT だけ引数が JSON の文字列で届きます。結果を合わせる鍵も tool_use_id・call_id・id と違います。Claude Haiku 5.5 の応答の約半分(251 往復のうち 125)には中身が空の考えの欄(thinking・署名つき。公式の説明では、このモデルは考える機能が既定で有効)が、Gemini 3.8 Flash の呼び出しには thoughtSignature が付き、どちらもそのまま会話に戻しました。
つなぐ所で起きた 3 つのつまずき
![① Gemini の parameters に inputSchema をそのまま入れると、HTTP 400 で Invalid JSON payload received. Unknown name $schema at tools[0].function_declarations[0].parameters と断られた。parameters は OpenAPI 3.0 の一部の形だけを受け付け、JSON Schema は parametersJsonSchema に入れる。② GPT に strict を書かずに渡すと、応答の tools で strict true と、employee_id・name・department の全部が required になった。モデルは lookup_employee を employee_id S-0000・name 木下・department 品質保証部で呼び、0 件だった。名前や部署で引く 5 作業がすべて 0 件、答えの正答は A の 29 から 26 に(この 30 作業で)。③ Gemini の呼び出しに付いた thoughtSignature を外して返すと、HTTP 400 で Function call is missing a thought_signature in functionCall parts と断られた](/articles/mcp-vs-function-calling/05-pitfalls.webp)
- ① Gemini の parameters: 公式のリファレンスでは、parameters は OpenAPI 3.0 の一部の形で、JSON Schema は parametersJsonSchema に入れ、2 つは同時に使えません。parametersJsonSchema に入れると通りました。断られた呼び出しの費用は 0 でした。
- ② GPT の strict: OpenAI の説明では、Responses API は道具の形を「できるなら strict に直す」とされ、strict では全部の引数を required にし、任意の引数は null を許す形で表します。strict を書かずに渡すと、任意の 3 つの引数が全部必須になり、モデルは使わない employee_id に形だけ合う「S-0000」を入れました。この条件で 30 作業を流し直すと(記事の最後の E)、名前や部署で引く 5 作業がすべて 0 件で、うち 4 作業の答えが外れました。社員番号で引く 3 作業は、ほかの引数に空の文字を入れて正しく引けました。
- ③ Gemini の thoughtSignature: generateContent の公式の説明は、署名を受け取ったとおりに返すことを勧め、関数の呼び出しに付いた署名は必須としています。外して返すと、2 往復目が 400 で断られました(2 作業・0.4 クレジット)。
道具の選び方が外れた所

- いちばん多かったのは要らない検索です(8 件)。答えは合っていましたが、1 往復多くかかりました。
- 答えられない作業で止まらないことがありました。 資料に無い育児休業の作業で、Gemini 3.8 Flash は検索の言葉を替えて 8 回くり返し、4 通りとも上限で答えが出ませんでした(1 回 2.4〜3.4 クレジット・16〜18 秒)。ほかの 2 社は 2〜4 回の検索で「資料に見つからない」と答えました。
- 天気・メール・株価の作業は、3 社とも 4 通りすべてで「できない」と伝えました。
- 選び方とは別に、言い直しの作業(1 文で)は、Claude Haiku 5.5 が 4 通りとも 2 文で答えて外れました。Claude Haiku 5.5 の外れは、4 通りともこの 1 つです。
説明文の書き方で、選び方は変わったか
MCP サーバーの説明文だけを 3 通りに替えました。引数の名前と形は同じで、短い説明では引数の説明も 1 語です。

- 2 件以上の差が出たのは、GPT-6 Luna の短い説明だけでした(選び方 27)。中身は上の「外れた所」の C の 3 件です。
- 引数の形の誤りは、短い説明でも 0 回でした。 説明が「開始日」だけでも、引数の名前と JSON Schema の pattern があり、3 社とも YYYY-MM-DD で送りました。
- 例を入れると、選び方は 29〜30 でした(詳しい説明は 28〜30)。定義のトークンは 2〜3 割増えました。
編集部の見立てでは、効いたのは長さより「使う場面と使わない場面」の一文です。詳しい説明の search_docs にある「社員個人の情報はこの資料に無いので、lookup_employee を」は、短い説明では消えました。Anthropic の説明も、詳しい説明文を道具の性能でいちばん大事な点とし、使う場面と使わない場面を書き、1 つの道具に 3〜4 文以上を勧めています。ただし差は 3 件で、言い切れません。
費用: 道具の定義と往復の数

- 道具の定義は往復のたびに全部送られ、入力のトークンとして課金されます。 道具 5 つ(詳しい説明)で 1 回の入力が Claude +1,725・GPT +870・Gemini +937 トークン増え、40 個では 7,000〜12,000 トークンになりました。Claude の増えた分には、道具を付けると自動で足されるシステムの指示(Claude Haiku 5.5・auto のとき 286 トークン。公式の表)も入っています。
- 道具の数の目安: OpenAI は 1 回の初めに使える道具を 20 個より少なく、Google は 10〜20 個までを勧めています。
- キャッシュ: OpenAI の説明では、1,024 トークン以上の入力が自動でキャッシュの対象になり、道具の定義も含まれます。GPT-6 Luna は A で入力の 49%、例入りの D で 82% がキャッシュから読まれ、D は 30 作業で 0.9 クレジットと GPT-6 Luna の 4 通りでいちばん安くなりました。

- 往復が増えると、前の会話と道具の結果も送り直すので、入力が積み上がります。 2 つの道具を順に使う作業は、1 つの作業の約 1.7〜2.4 倍のクレジットでした(図の T15 は約 4 倍)。
- 1 作業の費用は、Gemini 3.8 Flash がほかの 2 つの 5〜12 倍でした(道具 1 つの作業)。同じくらいの入力でも 1 往復のクレジットが大きく、毎回、考える分のトークンも付きました。
公式の説明と、よく読まれている解説と比べて
- 各社の「MCP を直接」つなぐ機能: Anthropic の MCP connector(beta)は、Messages API から遠隔の MCP サーバーに、別のクライアント無しでつなぎます。OpenAI の Responses API も遠隔の MCP サーバーを道具として使え、既定ではデータを渡す前に承認を求めます。Gemini は Interactions API で、Streamable HTTP の MCP サーバーにつなげます。今回の stdio のサーバーでは、どれも試していません。
- Portkey の解説(2026年3月): 「MCP は Function Calling を置き換えない」とし、Function Calling はモデルがしたいことを表し、MCP はその実行を標準にすると分けています。今回の結果も同じでした。
- Zenn のマルメのテックブログ(2025年5月): MCP では「LLM(Client)がMCP Serverに対してJSON-RPCでデータ要求を行い」と説明しています。今回の形では、JSON-RPC を送ったのはアプリで、モデルは Function Calling の印を返すだけでした(仕様の流れの図も同じ形)。アプリ全体をクライアントと呼べば、言い方の違いです。
気をつけること
- 道具に任せる範囲: MCP の仕様は、人が呼び出しを止められることと、大事な操作で確認を求めることを勧め、サーバーには入力の確かめと回数の制限を求めています(MUST)。今回の道具は読むだけなので、確認は付けていません。
- 入力に紛れた指示: 道具が外から取ってきた文に、モデルへの指示が紛れることがあります。Claude Code の説明はつなぐ前にサーバーを信用できるか確かめるよう、OpenAI の説明は悪意のあるサーバーが文脈の中身を持ち出せると注意しています。MCP の仕様は、信用できるサーバー以外の annotations を信用しないこと(MUST)を求めています。
- 測り方の限り: 30 作業を 1 回ずつで、A と B のように同じ定義でも 1 件は変わります。速い段のモデルだけで、道具が 5 つより多いときの選び方は確かめていません。秒は中継を通した、ほかの作業と共用のサーバーでの値です。
まとめ
- モデルに届くのは、MCP 経由でも各社の Function Calling の形の定義です。この 30 作業では、MCP 経由と手書きで道具の選び方は同じ数でした。
- つまずくのはつなぐ所です。Gemini は parametersJsonSchema に入れる、GPT は strict の扱いを決める、Gemini の thoughtSignature は返す、の 3 つです。
- 説明文には、使う場面と使わない場面を書いてください。定義は往復ごとに送られるので、道具の数と往復の数が費用を左右します。
渡した文(全文)
システムの指示(全条件・3 社で同じ)
Claude は system、GPT は instructions、Gemini は systemInstruction に入れました。
あなたは株式会社ソラマド計測の社内アシスタントです。社員からの質問に、日本語で答えてください。
- 社内の決まり・手続き・製品の仕様は、推測で答えず、道具で調べてから答える。
- 計算と日付の計算は、道具を使う。
- 道具が要らない質問には、道具を使わずに答える。
- 道具で調べても分からないこと・道具でできないことは、そのことを伝える。
- 答えは 3 文以内にする。
道具の説明文 3 通りの全文(詳しい・短い・例入り)
詳しい(A・B)。各行の「引数」は、JSON Schema の description に入れた文です。
search_docs: 株式会社ソラマド計測の社内資料(正社員就業規則・契約社員とパートタイマーの就業規則・給与と手当・旅費と出張・経費精算・情報システム・情報セキュリティ・製品 FAQ(ソラマド ロガー S1・S2)・ソラマド クラウドの利用案内・購買)を検索し、関係の深い節を返します。社内の決まり・手続き・製品の仕様を答えるときは、推測せずにこの道具で調べてください。社員個人の情報(所属・役職・雇用区分・連絡先)はこの資料に無いので、lookup_employee を使ってください。返り値は、資料名・見出し・本文の抜き出しです。
引数 query: 調べたいことを表す短い語や文(例: 経費精算 申請の期限)
引数 top_k: 返す節の数(1〜5・既定 3)
lookup_employee: 社員の名簿を引き、社員番号・氏名・部署・役職・雇用区分(正社員・契約社員・パートタイマー)・入社日・内線・メールを返します。employee_id・name・department のどれか 1 つ以上を指定します。名前は姓だけでも探せます。同じ名前の人が複数いるときは全員を返します。給与・評価など名簿に無い情報は返せません。
引数 employee_id: 社員番号(S- と 4 桁の数字。例: S-1000)
引数 name: 氏名か姓(例: 佐藤)
引数 department: 部署名(例: 製造部)
calculate: 四則演算の式を計算して、結果の数を返します。金額の合計・割合などの計算は、暗算せずにこの道具を使ってください。使える記号は + - * / と括弧と小数点だけです。カンマ(,)・×・÷・%・円などの単位は使えません。
引数 expression: 計算する式(例: 1500*12+3000)
date_calc: 日付に日数を足し引きして、結果の日付と曜日を返します。business_days を true にすると、土日と日本の祝日(2026〜2027 年)を除いた営業日で数えます。この道具は今日の日付を知らないので、「今日から」のときは先に get_current_date で今日を調べてください。
引数 start_date: 始まりの日(YYYY-MM-DD の形。例: 2026-09-01)
引数 days: 足す日数(整数。前に戻るときは負の数)
引数 business_days: true なら営業日で数える(既定 false)
get_current_date: 今日の日付と曜日(日本時間)を返します。引数はありません。「今日」「明日」「今日から○日後」のように、今日を基準にするときに使います。
短い(C)
search_docs: 社内資料を検索する。(引数 query: 検索語 / top_k: 件数)
lookup_employee: 社員を調べる。(引数 employee_id: 社員番号 / name: 氏名 / department: 部署)
calculate: 計算する。(引数 expression: 式)
date_calc: 日付を計算する。(引数 start_date: 開始日 / days: 日数 / business_days: 営業日で数える)
get_current_date: 今日の日付を返す。
例入り(D)。詳しい説明文の最後に、改行して次の 1 行を足しました。引数の説明は詳しいと同じです。
search_docs: 使い方の例: 「取引先との食事は 1 人いくらまで?」→ {"query": "交際費 1 人あたりの上限"}
lookup_employee: 使い方の例: 「製造部の佐藤さん」→ {"name": "佐藤", "department": "製造部"}/「S-1000 の人」→ {"employee_id": "S-1000"}
calculate: 使い方の例: 「1,500 円を 12 人分と 3,000 円」→ {"expression": "1500*12+3000"}/「8 万円の 15%」→ {"expression": "80000*15/100"}
date_calc: 使い方の例: 「2026年9月1日から 5 営業日後」→ {"start_date": "2026-09-01", "days": 5, "business_days": true}/「2026年9月1日の 2 週間前」→ {"start_date": "2026-09-01", "days": -14}
get_current_date: 使い方の例: 「今日は何日?」→ {}(引数なし)
作業 30 個の全文と正解(ユーザーの発言として、そのまま渡した)
| ID | 種類 | 作業の文 | 要る道具 | 正解 |
|---|---|---|---|---|
| T01 | 1 つ | 経費は、使った月のいつまでに申請しますか。 | search_docs | 使った月の翌月 5 営業日目まで |
| T02 | 1 つ | 社外秘の情報を社外に送るとき、共有リンクの有効期限は何日にしますか。 | search_docs | 7 日 |
| T03 | 1 つ | 終電がなくなったあとにタクシーで家に帰ると、いくらまで精算できますか。 | search_docs | 1 回 10,000 円まで |
| T04 | 1 つ | ソラマド ロガー S2 の温度の測定範囲を教えてください。 | search_docs | -40℃から 85℃ |
| T05 | 1 つ | 社員番号 S-1023 の人の名前と部署を教えてください。 | lookup_employee | 山本 翔太・開発部 |
| T06 | 1 つ | 品質保証部の木下さんの内線番号は何番ですか。 | lookup_employee | 3315(木下 恵) |
| T07 | 1 つ | 1 個 1,280 円の部品を 37 個買い、送料が 4,500 円かかります。合計はいくらですか。 | calculate | 51,860 円 |
| T08 | 1 つ | 売上 2,450 万円に対して利益が 318 万円でした。利益率は何 % ですか。小数第 1 位まで答えてください。 | calculate | 13.0 % |
| T09 | 1 つ | 2026年12月25日の 45 日後は、何月何日の何曜日ですか。 | date_calc | 2027年2月8日(月) |
| T10 | 1 つ | 2026年11月2日から 10 営業日後は何月何日ですか。土日と祝日は営業日に数えません。 | date_calc | 2026年11月17日(火) |
| T11 | 1 つ | 今日は何月何日の何曜日ですか。 | get_current_date | 10月15日(木) |
| T12 | 1 つ | 情報システム部の部長はだれですか。 | lookup_employee | 加藤 大輔 |
| T13 | 2 つ | 社員番号 S-1031 の人が結婚します。特別休暇は何日もらえますか。 | lookup_employee → search_docs | 契約社員なので 3 日 |
| T14 | 2 つ | 情報システム部の斎藤さんの配偶者が出産します。斎藤さんは特別休暇を何日もらえますか。 | lookup_employee → search_docs | 契約社員なので 1 日 |
| T15 | 2 つ | 部長が大阪市へ 1 泊 2 日で出張します。宿泊料の上限と日当を合わせると、最大でいくらですか。 | search_docs → calculate | 14,000 + 2,500 × 2 = 19,000 円 |
| T16 | 2 つ | 初めて海外出張をする課長が、アジアの国へ 3 日間出張します。支度金と日当を合わせるといくらですか。 | search_docs → calculate | 20,000 + 4,000 × 3 = 32,000 円 |
| T17 | 2 つ | 今日から 10 営業日後は何月何日ですか。土日と祝日は営業日に数えません。 | get_current_date → date_calc | 2026年10月29日(木) |
| T18 | 2 つ | 2026年11月20日に、許可リストに無いソフトの利用を申請しました。審査が終わるのは何月何日の見込みですか。 | search_docs → date_calc | 審査は 3 営業日なので 11月26日(木) |
| T19 | 2 つ | 社員番号 S-1012 の人が、名古屋市に出張して 1 泊します。宿泊料の上限は 1 泊いくらですか。 | lookup_employee → search_docs | 部長なので 14,000 円 |
| T20 | 2 つ | 自転車で片道 12 km の道のりを通勤しています。通勤手当は 1 年でいくらになりますか。 | search_docs → calculate | 月 7,100 円 × 12 = 85,200 円 |
| T21 | 2 つ | 品質保証部の前田さんは、1 か月に何時間まで時間外勤務ができますか。 | lookup_employee → search_docs | 契約社員なので月 20 時間まで |
| T22 | 2 つ | 今日から 30 日後は何曜日ですか。 | get_current_date → date_calc | 2026年11月14日(土) |
| T23 | 要らない | 次の文を、社外の人に送るメールの丁寧な 1 文に直してください。「資料ありがとう。来週見ておく」 | なし | 敬語で、お礼と来週見ることを 1 文に |
| T24 | 要らない | 「MCP」は何の略ですか。英語で答えてください。 | なし | Model Context Protocol |
| T25 | 要らない | 次の 3 つを五十音順に並べてください。品質保証部・営業部・情報システム部 | なし | 営業部・情報システム部・品質保証部 |
| T26 | 要らない | 「了解しました」と「承知しました」では、目上の人にはどちらを使うのがよいですか。1 文で答えてください。 | なし | 承知しました |
| T27 | 答えられない | 明日の東京の天気を教えてください。 | なし | 調べる道具が無いと伝える |
| T28 | 答えられない | 情報システム部の木下さんに、「会議を 15 時からに変えます」とメールで送ってください。 | なし(名簿は使ってよい) | メールを送る道具が無いと伝える |
| T29 | 答えられない | ソラマド計測の今日の株価はいくらですか。 | なし | 調べる道具が無いと伝える |
| T30 | 答えられない | 正社員の育児休業は、子どもが何歳になるまで取れますか。 | search_docs | 資料に記載が無いと伝える |
参考にした公式の情報
- Model Context Protocol「Versioning」(現行の版 2026-07-28)
- Model Context Protocol「Key Changes」(2026-07-28 版の変更点)
- Model Context Protocol「Tools」(2026-07-28 版)
- Anthropic「Donating MCP to the Agentic AI Foundation」
- Claude API Docs「Tool use with Claude」
- Claude API Docs「MCP connector」
- Claude API Docs「Define tools」
- OpenAI API「Function calling」
- OpenAI API「MCP servers」
- OpenAI API「Prompt caching」
- Gemini API「Function calling with the Gemini API」
- Gemini API リファレンス「Generating content」(FunctionDeclaration など)
- Gemini API「Gemini thinking」(generateContent の Thought signatures)
- Claude Code Docs「Connect Claude Code to tools via MCP」
- Zenn(マルメのテックブログ)「Function Calling vs. MCP──LLMを“真のエージェント”化する仕組み比較」
- Portkey「MCP vs Function Calling – How They Actually Work Together」
- YOBITSUGI AI「料金とシミュレーション」
執筆者
株式会社Game 代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。
この記事は、Claude Code を使って執筆しました。画面の画像は、検証環境で実際に操作して撮影したものです(引用の画像は出典を記載しています)。内容の誤りはお問い合わせからお知らせください。
連載
AI技術大全全 4 回の目次
- 1RAG の精度を上げるには? チャンク・ハイブリッド検索・リランクを順に足して測った
- 2LoRA の作り方 8GB の GPU で画像の LoRA を学習し、枚数と時間を測った
- 4MCP と Function Calling の違い MCP サーバーを自作して測った(この記事)
- 5日本語の埋め込みモデルを比較 社内資料の検索で 7 つを測った