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 で実行
    • モデルがするのはあくまでツール利用の提案まで
      • 実際に実行するのはアプリケーション

動作の流れ

  1. Host → Server に initialize(能力交渉)
  2. Host が list_resources / list_prompts / list_tools を呼んで一覧取得
  3. モデル(LLM)が必要に応じて read_resource / get_prompt / call_tool を実行
  4. 進捗通知・キャンセル・セッション管理などのユーティリティを活用

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