AI・機械学習
中級

MCPツール統合(エムシーピーツールトウゴウ)

MCPツール統合とは、Model Context ProtocolにおけるTools機能を使い、LLMが外部のAPI・データベース・ファイルシステム等のツールを標準化された方法で呼び出し、実行結果を取得する仕組みである。

0 回閲覧
0 いいね

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におけるツール呼び出しは以下の手順で行われる。

  1. ホストがLLMに「利用可能なツール一覧」を含むプロンプトを送信
  2. LLMが自然言語の指示を解析し、呼び出すツールとパラメータを決定
  3. ホストがMCPクライアント経由でtools/callリクエストをサーバーに送信
  4. サーバーがツールロジックを実行し、結果を返却
  5. ホストが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-githubGitHub15+Anthropic公式
@modelcontextprotocol/server-postgresPostgreSQL5+Anthropic公式
@modelcontextprotocol/server-filesystemローカルファイル10+Anthropic公式
@modelcontextprotocol/server-slackSlack8+Anthropic公式
@modelcontextprotocol/server-puppeteerWebブラウザ6+Anthropic公式
@modelcontextprotocol/server-google-mapsGoogle Maps4+Anthropic公式
@modelcontextprotocol/server-brave-searchBrave Search2+Anthropic公式
mcp-server-sqliteSQLite5+コミュニティ

ツール設計のベストプラクティス

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で数十行のコードからツール開発が可能