はじめに
こんにちは、日本マイクロソフトでCloud Solution Architectとして働いている百田です。本連載では、MCP(Model Context Protocol)を使ってLLMと外部ツールを統合する方法を解説します。
対象読者
- 生成AIやLLMの基礎知識がある方
- VS CodeやLLMを触ったことがあるエンジニア
- 企業で業務活用を検討中の担当者
必要な環境
- GitHub Copilot/Codespacesが有効なGitHubアカウント
MCPとは
MCPが生まれた背景
近年、ChatGPTやClaudeなどのLLMは驚くべき能力を発揮していますが、それらは基本的に外部の現実世界データやシステムから孤立して動作しています。例えば、最新情報の取得や外部サービスを操作するには、ユーザーが手動でデータをコピー&ペーストしたり、各LLMに専用のプラグインやAPI連携を実装したりする必要がありました。
この状況は「M×N問題」と呼ばれます。すなわち、M種類のAIアプリケーション(チャットボット、IDEアシスタント、業務フローに組み込まれたエージェントなど)とN種類の外部ツール/システム(ファイル、データベース、SlackやGitHubなど)を組み合わせるには、理論上M×N通りの統合作業が必要になるという問題です。各LLMプロバイダーが独自の機能呼び出し仕様を持ち、また各ツール側も異なるAPIを持つため、統合ポイントは無数に存在し、その都度、「関数呼び出し」などのカスタム実装が要求されていました。
こうした非効率を解決するため、Anthropic社が2024年末に提唱したオープン標準がMCP(Model Context Protocol)です。MCPの目的はLLMと外部ツール・データソースをつなぐ統一規格を提供し、爆発的なM×Nの組み合わせ問題を、M+Nの問題に変換することにあります。MCPを使えば、ツール開発者は各システムに対してN個の標準化されたMCPサーバーを用意し、アプリ開発者は各アプリに対してM個のMCPクライアントを実装するだけで済みます。新たなLLMやツールが増えても、標準プロトコルに従うことで相互接続がスムーズになり、重複する開発コストやメンテナンス負荷を大幅に削減できます。言い換えれば、MCPはAIアプリにおけるUSB-Cのような「共通ポート」を目指したものです。
MCPの基本的アーキテクチャと通信方式
MCPはクライアント・サーバ型のアーキテクチャを採用しています。従来、コードエディタと言語解析エンジンをつないだ言語サーバープロトコル(LSP)が広く使われていますが、MCPはその発想をLLMとツール連携に応用したものと捉えることができます。具体的には以下の通り。
- ホスト(Host):ユーザーが直接触れるLLMアプリケーション本体です(例:チャットボットやVSCodeなど)。ホストは必要に応じて複数のMCPクライアントを立ち上げます。
- クライアント(Client):ホスト内部で動作し、各MCPサーバーとの通信を担当するコンポーネントです(例:GitHub Copilot)。クライアントはホスト側のLLMからのリクエストを受け、標準化されたプロトコルメッセージに変換してサーバーへ送り、逆にサーバーからの応答をホスト/LLMが理解できる形に戻す役割を持ちます。
- サーバー(Server):外部システム側で動作し、特定のデータや機能をLLMに提供するためのコンテキストを公開するプログラムです。サーバーはMCP規格に従って、自らが提供可能なデータ・機能をカタログ化(自己記述)し、それをクライアントから問い合わせ可能にします。サーバーは例えば「ファイル読み書き」「データベース問い合わせ」「GitHub操作」などそれぞれ特化した役割を持ち、交換やアップグレードが容易なプラグイン的存在です。
通信方式には既存の信頼性高い仕組みが採用されています。MCPのメッセージ形式はJSON-RPC 2.0で規定されており、リクエストとレスポンスの対応付けやエラー通知などを統一フォーマットで扱います。クライアントとサーバー間の具体的なデータ送受には以下2種類のトランスポートが標準サポートされています。
- 標準入出力(stdio):ローカルでクライアントとサーバーを同一マシン上で動かす場合に使われるシンプルな方式です。プロセスの標準入出力ストリームを介してJSON-RPCメッセージをやり取りします。開発中のCLIツールや、ローカルファイル・データベースへのアクセス用サーバーなどに向いています。
- HTTP+サーバー送信イベント(Streamable HTTP/SSE):ネットワーク越しにサーバーと通信する場合に使う方式です。クライアントからサーバーへの呼び出しはHTTPのPOSTリクエストで送信し、サーバーからの応答は通常のHTTPレスポンスか、必要に応じServer-Sent Eventsによるストリーミングで逐次送信されます。SSEにより、リモートサーバーからクライアントへの非同期プッシュ通信や複数イベントの逐次送出が可能です。この方式はWebサービス的な利用や複数クライアントからの同時接続を扱う場合に適しています。
これらの設計により、MCPは言語非依存かつ拡張性の高い通信基盤を実現しています。実際、AnthropicはMCPの開発において「モデルの性能は与えるコンテキスト次第」という認識を強調しており(参考:Building Agents with Model Context Protocol-Full Workshop with Mahesh Murag of Anthropic)、さまざまなツールやデータをモデルに安全に供給できるよう、人間が介在して許可を与える仕組み(例えばツール実行前のユーザー承認)やセキュリティ考慮も組み込まれています。総じてMCPは、最小限の共通仕様でLLMと外界をつなぐ柔軟な基盤を提供することを設計方針としています。
MCP サーバーの構成要素(Tools・Resources・Prompts)
MCPサーバーがLLMに提供する機能は、大きく3つのプリミティブ(基本要素)に分類されます。それぞれTools(ツール)、Resources(リソース)、Prompts(プロンプト)と呼ばれ、用途や制御主体が異なります。
- Tools(ツール)–モデル制御:ツールはLLMが呼び出すことのできる外部アクションです。具体的にはコード内の関数や外部API呼び出しのラッパーで、必要な引数や処理内容をサーバー側で定義します。LLMはユーザーからの指示に応じ、このToolを関数呼び出しの形式で利用できます(OpenAIのFunction Callingに似ています)。ツールは「LLMエージェントが自動で操作できる機能」として位置付けられており、本番環境ではセキュリティのため通常ユーザーの実行許可が入ります。例えば「天気情報を取得する」「データベースからクエリを実行する」「ファイルを書き込む」といった操作をToolとして提供可能です。
- Resources(リソース)–アプリケーション制御:リソースはLLMに提供される読み取り専用のデータです。ファイルの中身、データベースのレコード、APIレスポンス、ログ情報など文脈として参照可能なデータをサーバー側で用意します。リソースはGETエンドポイントのように副作用なくデータ取得だけを行う点が特徴で、URIで一意に識別されます。リソースの使用タイミングや選択は基本的にホストアプリ側(ユーザー側)の判断となります。
- Prompts(プロンプト)–ユーザー制御:プロンプトはあらかじめサーバー側で用意されたLLMへの指示テンプレートです。定型的なタスクやワークフローを効率良く実行するため、複数ステップの発話や特定ツールの組み合わせをテンプレ化できます。プロンプトはユーザーが選択して使うことを想定しており、ユーザー入力に応じて変化する動的テンプレートも実装可能です。
なお、MCPクライアント側にもRootsとSamplingというプリミティブが定義されています。Rootsはクライアント(ホスト)のファイルシステム上のルートパスをサーバーに公開する仕組みで、サーバーがfile://
などのURI経由でホスト側ファイルへアクセスするために使われます。
Samplingはサーバーがクライアント側のLLMに新たなプロンプトを投げて追加の回答(サンプル)を得るためのメッセージで、エージェントを実装する際にサーバーからLLMへの再帰的呼び出しを可能にします(※ただし無制限な自己呼び出しは危険を伴うため、人間の確認を挟むべきとされています)。
RootsとSamplingは高度な機能ですが、基本的なMCP入門段階では主にTools・Resources・Promptsの3要素を押さえておけば十分です。
MCP導入のメリットと効果
MCPを利用することで、開発者・ユーザー双方にさまざまなメリットが得られます。
1.統一規格による開発効率向上
前述の通り、MCPはLLMと外部ツールの統合作業を劇的に簡略化します。標準化されたプロトコルに従うことで、「LLMごと・ツールごとに別々のインテグレーションコードを書く」必要がなくなり、一度MCPクライアントやサーバーを実装すれば他の対応製品でも再利用できます。その結果、重複実装の削減だけでなく、ツール/API側やモデル側の更新による接続切れにも迅速に追従しやすくなります。
2.エコシステム効果と多彩なツール活用
MCPはオープン標準ゆえにコミュニティ主導のエコシステムが急速に拡大しています。MicrosoftやAnthropicをはじめさまざまな企業・個人がMCP対応クライアントやサーバーを公開しており、「欲しい機能がすでに誰かのサーバーとして存在する」可能性が高まっています。
実際、公式のリポジトリにはファイル操作、データベース問い合わせ、社内Wiki検索、各種クラウドAPI連携など多岐にわたるMCPサーバーの実装例が蓄積されつつあります。MCP導入により、こうした豊富なツール群を自社LLMアプリに簡単に取り込み、提供機能を拡張できるのは大きな利点です。
3.一貫したユーザー体験と保守性向上
標準プロトコルによって、LLMから見たツールの扱い方が統一されます。異なる開発者や企業が作成した統合でも、MCP準拠であれば一貫した操作感をユーザーに提供できます。またプロトコル自体が自己記述的で、ツールのスキーマや説明を問い合わせることができるため、別途ドキュメントを読み込まなくてもLLMやクライアント側でツール内容を把握できます。これは保守性の点でも有利で、ツール側の変更があっても互換性を保ちながらクライアントが動的に適応できる仕組みがあります。標準化により実装の断片化や想定外の挙動が減り、ユーザーにとっても開発者にとっても安心して機能拡張できる環境が整います。
4.セキュリティ管理と人間の関与
MCPでは各ツール呼び出しに人の承認を挟める設計や、クライアント側で許可したサーバーのみ接続する仕組みになっており、AIエージェントの暴走や不正アクセスを防ぎやすいという利点もあります。企業内でMCPを導入する場合も、許可されたサーバー群だけをホワイトリスト管理しておけば、LLMが誤って機密データに触れるようなリスクを下げられます。
また、クライアントとMCPサーバーの間に認証ゲートウェイ(例:Azure API Management)を設置することで、「誰」が「どのMCPサーバー」の「どのツール」を実行できるかを細かく制御することも可能です。これにより、企業のセキュリティポリシーに則った安全なAIアプリケーションの運用が実現できます。
以上のように、MCPは開発コスト削減・機能拡張性・ユーザー利便性・安全性の各面で大きな導入効果をもたらすと期待されています。事実、2024年末~2025年にかけてMCPは急速に支持を集めており、「エージェント統合のデファクトスタンダード」と目される存在になりつつあります。
MCP対応クライアントとサーバーの現状・ユースケース
どんなアプリがMCPを使えるのか? 現在、MCPクライアント(ホスト)として代表的なものに以下があります。
- LLMチャット系アプリ:Anthropic社のClaudeDesktopは最初期からMCP対応を掲げ、ローカルファイル参照などにこのプロトコルを用いています。
- 開発用AIアシスタント・IDE:MicrosoftのGitHub CopiloはエージェントモードでMCPサーバー利用をサポートしました。さらにAI搭載エディタのCursor、Windsurf、Clineなど、多数の開発者向けツールがMCPクライアント機能を提供しています。これによりコーディング中にLLMが直接ファイルシステムへアクセスしたり、データベースクエリを実行したりといった高度な補助が可能です。
- カスタムAIエージェントフレームワーク:PythonやTypeScriptでエージェントを構築するためのLangChainやSemantic Kernel,AutoGenなども、MCP対応を進めています。MCPはあくまでツール接続のレイヤーですので、こうしたエージェントの思考・計画部分と組み合わせることで、より信頼性の高い自律エージェントを構築できると期待されています。
一方、MCPサーバー(外部ツール側)も公式・コミュニティからさまざまなものが公開されています。以下はユースケースの一例です。
- ファイルシステム・コードリポジトリ:ローカルまたはリモートのファイルを閲覧・検索・編集するサーバーや、Gitリポジトリに対してIssue作成やPR作成を行うGitHub MCPサーバーがあります。これを使うと、LLMが「このプロジェクトのREADMEを開いて」「新規ブランチを切ってプルリクエストを作成して」といった操作を直接行えます。
- データベース・クラウドサービス:PostgreSQLやSQLiteなどデータベースに接続してクエリを実行するサーバー、AWSやGCPのリソース情報を取得するサーバー、SlackやDiscordのメッセージを読み書きするサーバーなど、業務で使うさまざまなサービス向け実装があります。
- インターネット上の情報取得:Web検索をLLMに行わせるためのサーバーも存在します。例えばPerplexity MCPサーバーは、質問応答特化検索エンジンPerplexity.aiを叩いて最新情報を取得できます。
- その他ユニークな例:MCPの面白いユースケースとして、お天気サーバーがあります。Anthropic公式のクイックスタートでは、Pythonで天気予報APIを呼び出すMCPサーバーを作成し、Claudeから「明日の天気」を尋ねるデモが紹介されています。また次節で解説するTime MCPサーバーのように、現在時刻やタイムゾーン変換を提供するシンプルながら実用的なサーバーもあります。