生成AI

最終更新日:2025/05/14
エンジニアとしてAIアシスタントの開発に携わっているけれど、複数のサービスをAIと連携する場合APIをたくさん管理しなければならず、手間だと感じている人はいませんか?
AIを用いたサービスは加速度的に進化し続けていますが、その速さを支えるためにはエンジニアやプログラマーの業務効率化が欠かせません。
この記事では、そんな悩みを解決するMCPについて詳しく解説します。
MCP(Model Context Protocol)とは、Anthropic社が開発したオープンソースの通信プロトコル(通信を行うためのルールや約束事)です。
従来はAIの機能を拡張しようとするたびに各サービスに応じたAPIキーを取得・管理しなければならず、設定や保守に時間がかかっていました。
しかしMCPを使うとそのような煩雑な作業をすることなく、安全に双方向接続が構築できるのです。
MCPを利用することで、AIを用いたサービスの開発がさらにスムーズになるでしょう。
参考:Anthropic「Model Context Protocolの紹介」
画像出典:Model Context Protocol「紹介」
MCPは「MCPホスト」「MCPクライアント」「MCPサーバー」という3つのコンポーネント(構成要素)でできています。
それぞれが役割を持って独立しながら連携し、全体の仕組みを支えています。
3つのコンポーネントの役割は以下の通りです。
項目 | 概要 |
MCPホスト |
|
MCPクライアント |
|
MCPサーバー |
|
画像のようにMCPホスト内にあるMCPクライアントが、MCPサーバーとMCPプロトコルのルールでつながり、安全に双方向接続ができる仕組みです。
用語の意味を理解できればそれほど難解な仕組みではないので、画像と用語を照らし合わせながら確認してみましょう。
MCPの仕様について「構成」「通信メッセージ」「リクエスト」「レスポンス」「通知」「バッチ処理」「認証」「スキーマ」のご紹介します。
前の項目でご紹介したMCPプロトコルを構成する要素は以下の通りです。
項目 | 概要 |
基本プロトコル |
|
ライフサイクル管理 |
|
サーバー機能 |
|
クライアント機能 |
|
ユーティリティ |
|
それぞれが特定の役割を持ち、AIと外部ツールとの安全でスムーズな連携を可能にしています。
MCPクライアントとMCPサーバーの間の通信メッセージは、JSON-RPC 2.0 仕様に従ってやり取りを行わなければなりません。
JSON-RPC 2.0とはAIやアプリ同士が、JSONというデータ形式を使ってやりとりするためのルールのことで、以下の要素で構成されています。
項目 | 概要 |
JSON | 「JavaScript Object Notation」の略で、データを構造化して保存や交換をするための軽量なフォーマット |
RPC | 「Remote Procedure Call」の略で、ネットワーク上で接続された他のコンピュータのプログラムを呼び出して実行させるための技術やプロトコル |
2.0 | 使用されているJSON-RPCのバージョン番号 |
この仕様はシンプルで軽量という特長があり、MCPにおけるメッセージ通信を効率良く安全に行うために採用されています。
リクエストとは操作を始めてほしいというメッセージのことを指し、MCPにおいてはMCPクライアントからMCPサーバー、MCPサーバーからMCPクライアントの双方向で行えるのが特徴的です。
上記画像はリクエストのフォーマットで、次の要素が含まれます。
項目 | 概要 |
jsonrpc | 使用しているプロトコルのバージョン(固定で 2.0) |
id | リクエストを識別するための番号または文字列で、レスポンスと対応させるために使われる |
method | 実行してほしい操作やメソッドの名前 |
params(省略可) | 操作に必要なパラメータ(引数)でオプション扱い |
同じセッションの中で同じidを2回使ってはいけません。
また「.null」をidに使うこともできないため注意しましょう。
レスポンスとはリクエストに対する返答のことです。
MCPクライアントがMCPサーバー、MCPサーバーがMCPクライアントに操作が成功したかどうかを伝えるために使われます。
上記画像はレスポンスのフォーマットで、以下の要素が含まれます。
項目 | 概要 |
jsonrpc |
|
id |
|
result |
|
error |
|
error.data |
|
resultとerrorはどちらか一方だけが含まれるため、操作が成功したかどうか明確にわかる仕組みとなっているのです。
通知とはMCPクライアントとMCPサーバーの間で送る返答不要の一方向のメッセージのことです。
上記画像は通知のフォーマットで、次の要素が含まれます。
項目 | 概要 |
jsonrpc | 使用しているプロトコルのバージョン(固定で 2.0) |
method | 実行してほしい操作や通知の名前 |
params(省略可) | 任意で操作に必要な引数や追加データを入れてもよい |
通知は返答を必要としないため、IDを含めてはいけません。
バッチ処理とは複数のリクエストや通知を配列という形でまとめて送信することです。
MCPで使われるJSONでは、1つのリクエストや通知を{}内に記述しますが、それを[]の中に並べて入れると配列となります。
MCPクライアントにおいてバッチ送信の処理は任意ですが、受信は必ず処理しなければならないので注意しましょう。
MCPではトランスポート(通信手段)を使う際の認証に、以下のようなルールが存在します。
項目 | 概要 |
HTTPのトランスポートを使う場合 | MCPが用意した「認証フレームワーク」に従う |
STDIOのトランスポートを使う場合 | MCPが用意した「認証フレームワーク」には従わない |
また上記のルール以外に、MCPクライアントとMCPサーバーの間で交渉(ネゴシエート)をした上で、独自のカスタム認証(MAY)を使ってもよいことになっているのです。
MCPでは、認証方法についてはまだ開発途上のため、GitHub Discussionsで意見を出し合ってより良い仕組みに育てていくのが望ましいとしています。
スキーマとは、プロトコルで使われるメッセージやデータの構造を定義した設計図のことです。
MCPには次の2種類のスキーマがあります。
項目 | 概要 |
TypeScriptスキーマ | プロトコルの完全な仕様を定義するための信頼できる情報源 |
JSONスキーマ | TypeScriptスキーマから自動生成される形式 |
TypeScriptで定義されたスキーマが公式な出発点で、そこから自動的にJSONスキーマが作られる仕組みとなっているのです。
このためどちらを使っても一貫した構造となり、ツールとの連携がスムーズにできます。
画像出典と参考:Model Context Protocol「概要」
MCPでできることは、MCPサーバーがMCPクライアントに提供できることとMCPクライアントがMCPサーバーに提供できることの2つに分かれます。
MCPサーバーがMCPクライアントに提供できることは以下の通りです。
項目 | 概要 |
リソース | ユーザーやAIモデルが利用できるコンテキストやデータ |
プロンプト | ユーザー向けのテンプレート化された通信メッセージやワークフロー |
ツール | AIモデルが実行できる関数や操作 |
一方、MCPクライアントがMCPサーバーに提供できることは次の通りです。
項目 | 概要 |
サンプリング | サーバー主導でのエージェント的な挙動や、LLM(大規模言語モデル)との再帰的(自分自身で出した答えを再度深堀りして考えること)な対話 |
MCPは双方向の接続を特徴とするため、できることも2種類に分かれるのを意識しましょう。
MCPの使い方を4つのステップでご紹介します。
MCPを使うには開発環境の準備が必要です。
以下の手順で進めてみましょう。
Node.js(バージョン18以上)とnpm(Node Package Manager)をインストールします。
新しいディレクトリ(コードファイルを整理するための入れ物)を作成し、移動します。
npmを使用してプロジェクトを初期化します。
MCP TypeScript SDKとはMCPで開発をしやすくするための道具セットのようなもので、よく使う関数、型の定義、サンプルコードなどが含まれています。
TypeScriptとZodをインストールします。
ZodとはTypeScriptでデータの型をチェックしたり定義したりできるツールです。
tsconfig.jsonファイルを作成し、上記画像の内容を記述します。
srcディレクトリを作成し、その中にindex.tsファイルを作成します。
MCPサーバーの基本的な機能を実装します。
次の手順で進めてみましょう。
上記画像に含まれる要素のうち理解しておきたいのが以下の3つです。
項目 | 概要 |
McpServer | MCPサーバーのインスタンスを作成するためのクラス(同じオブジェクトを作るための設計図) |
StdioServerTransport | 標準入出力(STDIO)を使った通信を行うためのトランスポートクラス |
zod | 入力データのスキーマを定義し、バリデーションを行うためのライブラリ |
要素1つ1つをしっかり理解してから実装を進めることが大切です。
クラスを元にして、実際に使えるオブジェクトを作ります。
nameでサーバーの名前、versionでサーバーのバージョンを指定します。
受け取ったメッセージをそのまま返す「echo」ツールを追加しましょう。
上記画像に含まれる要素のうち理解しておきたいのが以下の3つです。
項目 | 概要 |
‘echo’ | ツールの名前 |
{ message: z.string() } | 入力パラメータのスキーマを定義しmessageという文字列を受け取る |
async ({ message }) => { … } | ツールの実装で、受け取ったmessageをそのまま返している |
ツールに応じて記述内容が変わるため注意しましょう。
StdioServerTransportとは標準入出力を使った通信を行うトランスポートで、server.connect(transport)でサーバーをトランスポートに接続します。
ここまででMCPサーバーの基本的な実装は完了です。
最初は記述内容を理解するのが難しいですが、確認しながら進めてみましょう。
参考:ChatGPT
MCPクライアントからMCPサーバーに誰でもアクセスできると困るので、認証してから接続できるようにします。
MCPサーバーではトークンベースの認証が行われるため、例えば上記のようなコードを設定すると、トークンと一致した場合のみアクセスが可能となります。
セキュリティを確保し、安全な接続を維持するためにも認証設定は重要です。
MCPサーバーでは、クライアントから受け取るツールの呼び出しリクエストを処理できるようにする必要があるため、次の手順でサーバー側でツールの定義を行います。
画像出典:ChatGPT
画像の中で理解しておきたい要素は以下の3つです。
項目 | 概要 |
“echo” | クライアントが呼び出すツール名 |
z.object({ message: z.string() }) | 入力のスキーマでZodライブラリで検証される |
async ({ message }) => { return { message }; } | 入力を受け取って、そのまま返す非同期関数(時間がかかる処理を待ちながら他の処理を進める関数) |
ツール名を変更すれば別のツールも呼び出せます。
TypeScriptは人間にとって理解しやすいプログラムの形ですが、コンピュータはそのままだと読めないため、コンピュータにとってわかりやすいJavaScriptなどの形に変更する必要があります。
変換されたJavaScriptのプログラムを実際に動かすことです。
以上の手順を踏むことで、MCPサーバーはクライアントのツール呼び出しに応じて応答を返すことができるようになります。
参考と画像出典:GitHub「Model Context Protocol (MCP) サーバー開発ガイド: LLM 用の強力なツールの構築」
MCPとは、Anthropic社が開発したオープンソースの通信プロトコルです。
MCPを利用した安全な双方向接続を活用し、ぜひAIを用いたサービスの開発をスムーズに進めてみてください。
業務の課題解決に繋がる最新DX・情報をお届けいたします。
メールマガジンの配信をご希望の方は、下記フォームよりご登録ください。登録無料です。
AI製品・ソリューションの掲載を
希望される企業様はこちら