大規模言語モデルは、単体では社内データベースを問い合わせたり、ローカルファイルを読み取ったり、内部 API を呼び出したりできません。不足しているのは知能ではなく、AI と現実世界をつなぐ標準的な方法です。それを担うのが Model Context Protocol(MCP) です。
本記事は Python または TypeScript に慣れたバックエンド・AI エンジニアを対象に、プロトコル理論から本番デプロイまでを一気通貫で解説します。Tools・Resources・Prompts を備えた動作する MCP Server を構築し、Cursor や Claude Desktop に接続する手順までカバーします。読了後には、ゼロから Server を書き、個人ナレッジベースプロジェクトまで持っていけるはずです。
01 MCP プロトコル:Function Calling から統一標準へ
現場の痛点:LLM ベンダーごとに Function Calling の形式が異なり、モデルを切り替えるたびに統合コードを書き直す必要があります。LangChain のツール定義はフレームワーク内に閉じ込められ、IDE 間で持ち運べません。
- 進化の流れ:Function Calling(ベンダー固有)→ ChatGPT Plugins(プラットフォーム依存)→ MCP(オープン標準)。Anthropic は 2024 年 11 月に MCP をオープンソース化し、JSON-RPC 経由で AI とシステム間の通信を統一しました。
- ロール分担:MCP Client は AI 側(Claude Desktop、Cursor など)に存在します。MCP Server は開発者が構築する側で、Tools(呼び出し可能な関数)、Resources(読み取り可能なデータ)、Prompts(再利用テンプレート)を公開します。
- トランスポート:JSON-RPC 2.0 を stdio(ローカル・低レイテンシ)または HTTP + SSE / Streamable HTTP(リモート・マルチクライアント)で運びます。ライフサイクルはハンドシェイク → 能力交渉 → リクエスト処理 → シャットダウンです。
| 観点 | MCP | OpenAI FC | LangChain |
|---|---|---|---|
| 標準化 | オープン、モデル横断 | ベンダー私有 | フレームワーク依存 |
| Resources / Prompts | ネイティブ対応 | 非対応 | 非対応 |
| エコシステム(2026 年) | 10,000 超 Server | 成熟、OpenAI 限定 | 成熟、フレームワーク限定 |
MCP Server を一度書けば、Cursor、Claude Desktop、VS Code から同じツールを呼び出せます。AI ツール統合における USB-C の瞬間です。
02 環境構築と最初の Hello World Server
言語選定:Python は公式 mcp パッケージと FastMCP を使い、初学者に最適です。TypeScript は @modelcontextprotocol/sdk でフルスタックチーム向けです。以下の例は Python を使います。
python -m venv .venv
source .venv/bin/activate
pip install mcp
npm init -y
npm install @modelcontextprotocol/sdk
プロジェクト構成:server.py、tools/、resources/、prompts/、tests/、pyproject.toml を用意します。
デバッグ環境:公式 MCP Inspector(npx @modelcontextprotocol/inspector)、Claude Desktop は claude_desktop_config.json、Cursor は Settings → MCP から接続します。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-first-server")
@mcp.tool()
def say_hello(name: str) -> str:
"""指定した名前の人に挨拶する"""
return f"Hello, {name}! これは最初の MCP ツールです。"
if __name__ == "__main__":
mcp.run()
python server.py を実行するか、npx @modelcontextprotocol/inspector python server.py で Inspector 上のツール一覧を確認します。Cursor または Claude Desktop を設定すると、AI コンテキストにツールが表示されるはずです。
03 Tools 開発:五類の実用パターン、非同期とエラー処理
ツールの基本構造:関数シグネチャがそのままドキュメントになります。パラメータ型、戻り値型、docstring は JSON Schema に変換され、AI が理解します。命名は snake_case で動詞始まり(search_web、read_file)が推奨です。
複雑な入力:Pydantic BaseModel で型安全な入力を定義できます。
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="検索キーワード")
max_results: int = Field(default=5, description="最大返却件数")
@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
"""Web 検索を実行し、関連結果のリストを返す"""
...
五類の実用ツール:
- 計算機:数式を安全にパース(
evalによる注入を避ける)。 - ファイル読み書き:アクセス可能なディレクトリをホワイトリストで限定。
- HTTP クライアント:外部 REST API 呼び出し、タイムアウトとレスポンスサイズ上限を設定。
- 読み取り専用 SQL:パラメータ化クエリのみ、DDL は禁止。
- タイムゾーン:現在時刻と変換、Agent のスケジューリングに必須。
非同期 IO:ネットワーク呼び出しは async def と httpx.AsyncClient を使い、stdio イベントループのブロックを避けます。本番向けには生の例外ではなく error・code を含む構造化エラーを返し、タイムアウトと権限チェックを追加します。
04 Resources と Prompts:データ供給と再利用テンプレート
Resource vs Tool:Resource はデータ提供者(AI が読み取る)、Tool はアクション実行者(AI が呼び出す)です。Resource は URI でアドレス指定します:file://、http://、custom://。
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
return json.dumps({"version": "1.0", "env": "production"})
@mcp.resource("user://{user_id}/profile")
def get_user_profile(user_id: str) -> str:
return json.dumps(db.query_user(user_id))
リソース種別:テキスト(text/plain、application/json)、バイナリ(画像・PDF)、ストリーミング(リアルタイムデータ)に対応します。ファイルシステム Resource Server では、ディレクトリ一覧、ファイル読み取り、変更イベント購読が実装できます。
Prompts:パラメータ注入可能な再利用プロンプト断片で、チームの Prompt 一貫性を高めます。user と assistant ロールを含む多ターン テンプレートは、コードレビュー、面接シミュレーション、デバッグアシスタントに適しています。
05 HTTP トランスポート、デバッグ、本番デプロイ
| 特性 | stdio | HTTP + SSE |
|---|---|---|
| デプロイ | ローカルプロセス | リモートサーバー |
| マルチクライアント | 非対応 | チーム共有に対応 |
| 適用場面 | 個人ローカルツール | SaaS / チーム MCP サービス |
リモート例:FastMCP("remote-server", transport="streamable-http") を uvicorn でポート 8000 に載せます。本番では Bearer Token、API Key ミドルウェア、CORS ホワイトリスト、レート制限で堅牢化します。
デバッグ:MCP Inspector で Tools 呼び出しと JSON-RPC ログを確認し、mcp.client.stdio 経由の pytest で session.call_tool の戻り値を検証します。
| 症状 | 原因 | 対処 |
|---|---|---|
| ツールが AI に表示されない | 設定パス誤り | mcp.json / claude_desktop_config.json を確認 |
| JSON シリアライズ失敗 | 非対応の戻り値型 | str または dict に変換 |
| タイムアウト切断 | ツール実行が遅い | 非同期化とタイムアウト設定 |
本番デプロイ:Docker(Python 3.12-slim)、Railway / Render は個人プロジェクト向け、Lambda / Cloud Run は Serverless、VPS では Nginx リバースプロキシ。構造化ログ、Prometheus メトリクス、Sentry アラート、/health エンドポイントを追加し、MCP プロトコルバージョンを宣言してツール更新は後方互換を維持します。
06 ナレッジベース実装、エコシステム、六段階導入
総仕上げプロジェクト:個人ナレッジベース MCP Server で Markdown ノートをセマンティック検索し、エントリ作成とファイル監視を行います。ChromaDB / Qdrant、text-embedding-3-small、watchfiles を組み合わせ、Cursor で「先週 MCP について何を書いた?」と聞けば Agent が検索ツールを呼び出します。
2026 年の参考 Server:mcp-server-filesystem、mcp-server-github、mcp-server-brave-search、mcp-server-postgres、mcp-server-slack。主要クライアントは MCP をネイティブサポートし、エンタープライズ向けセキュリティ基準とマーケットプレイスが成熟しています。
- プロトコル:Anthropic が 2024 年 11 月に MCP をオープンソース化(JSON-RPC 2.0)。2026 年にガバナンスが Linux Foundation AAIF へ移管されました。
- エコシステム:公開 MCP Server は 10,000 を超えます。Python SDK と TypeScript SDK が公式保守の主軸です(発版後は GitHub で最新版を確認してください)。
- トランスポート:Streamable HTTP が純 SSE に代わり、クラウドの無状態ロードバランシングに適しています。
公式ドキュメントと SDK(発版後はリンクを再確認してください):
https://modelcontextprotocol.io
https://github.com/modelcontextprotocol/python-sdk
https://github.com/modelcontextprotocol/typescript-sdk
https://github.com/modelcontextprotocol/inspector
- 言語とトランスポートを決める:個人開発は Python + stdio、チーム共有は HTTP + Streamable HTTP。
- モジュール骨格を組む:tools / resources / prompts に分割し、MCP Inspector を導入。
- Hello World を接続確認:Cursor または Claude Desktop でツールの可視性と呼び出しを検証。
- 五類 Tools と Resource を拡張:読み取り専用から始め、書き込みと外部 API を段階追加。
- テストと Docker を自動化:CI で stdio 統合テストを実行。
- 7×24 環境へデプロイ:ノート PC のスリープは MCP セッションを切断します。純 Linux VPS には macOS サンドボックスと Xcode がありません。安定した MCP インフラ、共有 Agent、iOS CI が必要な本番では、CALMVPS ベアメタル Mac レンタル が実務上しばしば最適です。専有 M4 / M4 Pro、約 120 秒プロビジョン、柔軟課金。機種は 料金ページ、リモート接続は ヘルプセンター、注文は Mac mini M4 注文 をご確認ください。
MCP は AI ツール化の標準プロトコルです。習得すれば任意の LLM に現実世界の能力を拡張できます。今日の Hello World から始めてみてください。