MCPプロトコルの仕組み
MCP(Model Context Protocol)の概要と仕組み、AIエージェントにおける役割、通信方式、実装例について解説する。


サムネはUnsplashのKelly Sikkemaが撮影した写真
はじめに
MCP(Model Context Protocol)は、LLM(大規模言語モデル)が外部のツールと連携するための仕組みである。特にAIエージェント構築において、柔軟かつ標準化されたツール呼び出しを実現する手段として注目されている。
用語
Host
AIエージェント本体を動作させる環境。MCP Clientもこの中で動作する。
MCP Client
エージェントがツールを呼び出す際に利用するクライアント側のモジュール。Host内で動作し、ツールとの通信を担当する。
MCP Server
ツールそのもの、あるいはツールの操作を受け付ける外部プロセス。Clientと通信し、実行結果を返す。
MCPを使ったAIエージェントの動作イメージ
- MCP ClientはHost内で動作する。
- MCP ClientとMCP Serverにはそれぞれ複数のツールが含まれる。
- 例:
- ローカルのMCP Server:
playwright-mcp-server
(ブラウザ操作) - インターネット上のMCP Server:
google-search-mcp-server
(Google検索API呼び出し)
- ローカルのMCP Server:
- 例:
- MCP ClientとMCP Serverは1:1対応で設計されている。
- 例:
playwright-mcp-client
はplaywright-mcp-server
にのみ接続する。
- 例:
- MCP Serverにはローカルで動作するものと、インターネット経由で通信するものがある。
- 基本的にはローカル動作の構成が主流である。
- 外部APIとやり取りするMCP Serverも存在する。
- 例:Google検索、天気予報API、翻訳サービスなどを利用するMCP Server。
MCP ClientとMCP Serverの通信プロトコル
MCP Client ←→ MCP Server(ローカル)
- 通信には標準入出力(STDIN/STDOUT)を用いる。
- MCP ClientがMCP Serverをプロセスとして起動し、双方向にデータを送受信する。
MCP Client ←→ MCP Server(インターネット上)
- SSE(Server-Sent Events)による通信が主流。
- 非同期リクエストとなることが多く、ストリーミングでレスポンスを返す設計が多い。
コード例
以下は、MCP ClientがローカルのMCP Serverを起動し、提供されているツールの一覧を取得するコード例である。
from mcp_sdk import MCPServerStdio
fetch_params = {"command": "uvx", "args": ["mcp-server-fetch"]}
async with MCPServerStdio(params=fetch_params) as server:
fetch_tools = await server.list_tools()
for tool in fetch_tools:
print(f"{tool.name}: {tool.description.replace('\n', ' ')}")
この例では、mcp-server-fetch
というMCP Serverを起動し、list_tools()
を用いて利用可能なツールの一覧を取得している。
fetch_params
でプロセス(MCP Server)を起動するコマンドを定義している。プロセスを起動して標準入出力をマウントし、データのやり取りを行うことになる。
おわりに
MCPはLLMがツールと連携するためのシンプルで柔軟な仕組みである。ローカル実行や外部APIとも容易に接続でき、AIエージェントの拡張性を高める手段として有効である。
いろんなベンダーがMCP Serverを実装しているので、基本的には公開されているMCP Serverを使うのがよい。
ToolとMCP Serverの使い分けだが、再利用可能・公開したい場合には自前でMCP Serverを作っても良いが、それ以外の場合(使い捨ての関数など)はToolにした方が利便性が高い。
参考
このコースで学んだ内容です。めっちゃ勉強になるのでおすすめです。
https://www.udemy.com/course/the-complete-agentic-ai-engineering-course/

通りすがりのラマ🦙
このブログでは個人開発で得た知見や興味のあるテクノロジーに関する記事を執筆します。 日々公開されている情報に助けられているので、自分が得た知見も世の中に還元していければと思います。 解決できないバグに出会うと、草を食べます。🦙🌿 経歴: 情報工学部→日系SIer→外資系IT企業 興味: Webアプリケーション開発、Webデザイン、AI 趣味: 個人開発、テニス