MCP サーバとは
MCP = Model Context Protocol
LLM アプリ(IDE、チャットUI など)と外部の ツール・データ をつなぐオープンなプロトコル。
メッセージは JSON‑RPC 2.0 でやり取りする。
MCP サーバ概説
- Host(例:Claude Desktop / Claude Code などの LLM アプリ)
- Client(Host 内のコネクタ)
- Server(ツール提供側が作る「MCP サーバ」)
- 仕様上、サーバは Resources / Prompts / Tools の3つのプリミティブを提供
Resources / Prompts / Tools
- Resources
- モデル(LLM)が参照する「データやファイル」
git://repo/xxxやfile://path/to/xxxのような URI で識別resources/listで探し、resources/readで中身を読む- 実際に OS からリソースを読むのはアプリケーションであり、読んだデータをアプリがモデルに渡す
- LLM 自身にデータを読む権限は与えない
- Prompts
- 使い回せる「会話テンプレート」
prompts/listで探し、prompts/getに引数を渡してテンプレ化されたメッセージ群を取得
- Tools
- モデル(LLM)が呼び出す「関数」
- API 呼び出し・計算・副作用のある処理を実行
- クライアントが
tools/listで探し、tools/callで実行 - モデルがするのはあくまでツール利用の提案まで
- 実際に実行するのはアプリケーション
動作の流れ
- Host → Server に initialize(能力交渉)
- Host が list_resources / list_prompts / list_tools を呼んで一覧取得
- モデル(LLM)が必要に応じて read_resource / get_prompt / call_tool を実行
- 進捗通知・キャンセル・セッション管理などのユーティリティを活用
MCP サーバの構築 with FastMCP
インストール:
pip install 'mcp[cli]'
実装(server.py):
from mcp.server.fastmcp import FastMCP
# HTTP で返答を JSON 固定に(ツール結果の扱いが安定)
mcp = FastMCP(
name="HelloMCP",
stateless_http=True, # HTTP では stateless が扱いやすい(推奨設定)
json_response=True,
host="127.0.0.1",
port=8001
)
# --- Tool(モデルが呼び出す関数) ---
@mcp.tool()
def add(a: int, b: int) -> int:
"""2つの整数を加算して返します。"""
return a + b
# --- Resource(文脈データの提供) ---
@mcp.resource("greet://{name}")
def greet(name: str) -> str:
"""挨拶用の短いテキストを返します。"""
return f"こんにちは、{name}さん!"
# --- Prompt(再利用できるテンプレート) ---
@mcp.prompt()
def greet_prompt(name: str, style: str = "friendly") -> str:
"""指定した調子での挨拶文を生成するためのテンプレート。"""
return f"{name}さんへの挨拶文を、{style}な調子で書いてください。"
if __name__ == "__main__":
# HTTP サーバとして起動(デフォルト: http://localhost:8000/mcp)
mcp.run(transport="streamable-http")
起動:
python server.py
接続:
npx -y @modelcontextprotocol/inspector
Technical Note - MCP