MCPツール統合(エムシーピーツールトウゴウ)
MCPツール統合とは、Model Context ProtocolにおけるTools機能を使い、LLMが外部のAPI・データベース・ファイルシステム等のツールを標準化された方法で呼び出し、実行結果を取得する仕組みである。
MCPツール統合は、LLMが外部ツールを安全かつ構造化された方法で呼び出すためのModel Context Protocolの中核機能である。MCPのToolsプリミティブはJSON Schemaでパラメータを定義し、LLMが自然言語の指示からパラメータを自動推論して呼び出す。Function CallingやTool Useが各LLMプロバイダ固有の仕様であるのに対し、MCPツールはプロバイダ非依存の統一インターフェースを提供する。
ツール定義の構造
MCPツールは以下の4要素で定義される。
- name: ツールの一意識別子(英数字・ハイフン・アンダースコア)。LLMがツールを選択する際のキーとなる
- description: ツールの目的と使い方の自然言語説明。LLMがどのツールを呼ぶか判断する根拠になるため、具体的で正確な記述が重要
- inputSchema: JSON Schemaによるパラメータ定義。型(string/number/boolean/array/object)、必須/任意、バリデーション制約を厳密に指定
- annotations: ツールのメタデータ(読み取り専用か、副作用があるか、冪等性があるか等)。ホストがユーザー承認のUIを制御する際に参照する
tools/listメソッドでサーバーが公開する全ツールの一覧を取得し、tools/callメソッドで特定のツールを実行する。
ツール呼び出しフロー
MCPにおけるツール呼び出しは以下の手順で行われる。
- ホストがLLMに「利用可能なツール一覧」を含むプロンプトを送信
- LLMが自然言語の指示を解析し、呼び出すツールとパラメータを決定
- ホストがMCPクライアント経由で
tools/callリクエストをサーバーに送信 - サーバーがツールロジックを実行し、結果を返却
- ホストがLLMに結果を渡し、次のアクションを決定
このフローではHuman-in-the-loop(ユーザー承認)が重要な安全装置として機能する。ファイル削除やメール送信など副作用のある操作は、ホストがユーザーに確認を求めてから実行する。
実装例: GitHub Issues ツール
server.tool(
"create_issue",
{
title: { type: "string", description: "Issue のタイトル" },
body: { type: "string", description: "Issue の本文(Markdown)" },
labels: { type: "array", items: { type: "string" }, description: "ラベル名の配列" },
},
async ({ title, body, labels }) => {
const response = await fetch("https://api.github.com/repos/owner/repo/issues", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.GITHUB_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ title, body, labels }),
});
const issue = await response.json();
return {
content: [{ type: "text", text: `Issue #${issue.number} を作成しました: ${issue.html_url}` }],
};
}
);
公式リファレンスサーバー一覧
| サーバー名 | 対象サービス | 提供ツール数 | メンテナ |
|---|---|---|---|
@modelcontextprotocol/server-github | GitHub | 15+ | Anthropic公式 |
@modelcontextprotocol/server-postgres | PostgreSQL | 5+ | Anthropic公式 |
@modelcontextprotocol/server-filesystem | ローカルファイル | 10+ | Anthropic公式 |
@modelcontextprotocol/server-slack | Slack | 8+ | Anthropic公式 |
@modelcontextprotocol/server-puppeteer | Webブラウザ | 6+ | Anthropic公式 |
@modelcontextprotocol/server-google-maps | Google Maps | 4+ | Anthropic公式 |
@modelcontextprotocol/server-brave-search | Brave Search | 2+ | Anthropic公式 |
mcp-server-sqlite | SQLite | 5+ | コミュニティ |
ツール設計のベストプラクティス
MCPツールの品質はLLMの出力品質に直結する。以下の設計原則が推奨される。
- 単一責務: 1ツール1機能。
manage_databaseではなくquery_database、insert_record、delete_recordのように分割する - 明確な命名:
do_thingではなくsearch_users_by_emailのように動詞+名詞+修飾子で命名する - 詳細なdescription: LLMが「いつこのツールを使うべきか」を判断できるレベルの説明を記述する。否定条件(「〇〇には使わない」)も有効
- 厳密なスキーマ: optional パラメータには
default値を設定し、enumで選択肢を制限する。LLMの推論負荷を下げ、エラー率を低減する - エラーハンドリング:
isError: trueフラグと人間可読なエラーメッセージを返す。スタックトレースは含めず、ユーザーが次にとるべきアクションを示す - 冪等性の考慮: 可能であればツールを冪等にし、annotations で
readOnlyHintやidempotentHintを宣言する
よくある質問(FAQ)
Q1: 1つのMCPサーバーに定義できるツール数に上限はありますか?
A: プロトコル上の上限はないが、実用的には20〜30ツール以内が推奨される。ツールが多すぎるとLLMの選択精度が低下し、レスポンス遅延も増加する。50以上のツールが必要な場合はサーバーを機能単位で分割するか、tools/listのカーソルベースページネーション(2025年仕様追加)を活用する。
Q2: ツール実行中に進捗を通知できますか?
A: できる。MCPのnotifications/progressメソッドでprogressToken付きの進捗通知をクライアントに送信できる。大量のファイルコピーやデータベースマイグレーションなど長時間実行されるツールで有用。ホスト側はプログレスバーやパーセンテージ表示でユーザーに進捗を表示する。
Q3: ツール呼び出しの結果にテキスト以外を含められますか?
A: 含められる。MCPのToolResultContentはtext(プレーンテキスト/Markdown)、image(base64エンコード画像)、resource(埋め込みリソース参照)の3種類をサポートする。画像生成ツールやグラフ作成ツールではimageタイプ、ファイル参照ではresource`タイプを使い分ける。
まとめ
- MCPツールはJSON Schemaでパラメータを定義し、LLMが自動的に呼び出す仕組み
- Human-in-the-loopによるユーザー承認で安全性を確保
- 公式リファレンスサーバーでGitHub・PostgreSQL・ファイルシステム等を即座に利用可能
- 単一責務・明確な命名・厳密なスキーマが高品質ツール設計の鍵
- TypeScript/Python SDKで数十行のコードからツール開発が可能