コードを書く前に MCP を理解する:進化、三層構造、単発統合を超える理由
Model Context Protocol は Anthropic が 2024年11月 に公開したオープン標準で、AI クライアントが外部能力をどう発見・呼び出すかを一本化します。要点はシンプルです。Server を一度書けば Claude Desktop、Cursor、その他 MCP 対応クライアントから接続でき、下位 LLM を差し替えてもツール層を書き直す必要がありません。
Function Calling 時代:各 LLM ベンダーが独自スキーマを提供し、GPT・Claude・Gemini ごとにアダプタコードが必要でした。
Plugins 波:ChatGPT Plugins がライブデータ連携の需要を証明しましたが、OpenAI 専用で閉じたエコシステムのままでした。
MCP 標準化:Anthropic がベンダー中立プロトコルを OSS 化。2026年には OpenAI、Google、Microsoft も Linux Foundation AAIF 傘下で採用しています。
設計目標:HTTP が Web サービスを標準化したのと同様に、AI とツール間の通信を一本化し、実行時発見と自己記述ツールを実現します。
┌────────────────────┐ ┌─────────────────────┐
│ MCP Client │ ◄─────► │ MCP Server │
│ (Claude / Cursor) │ JSON │ (あなたが構築) │
│ │ -RPC │ │
└────────────────────┘ └─────────────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
Tools Resources Prompts
(アクション) (データ読取) (テンプレート)
| 能力 | 役割 | 例 |
|---|---|---|
| Tools | AI が呼び出す関数 | 検索、計算、SQL、HTTP 呼び出し |
| Resources | URI で読むデータ | 設定ファイル、ユーザープロフィール、ノート索引 |
| Prompts | 再利用プロンプト | コードレビュー、面接シミュレーション、デバッグ支援 |
ワイヤ形式は JSON-RPC 2.0 です。ライフサイクルは initialize ハンドシェイク → 能力交渉 → リクエスト/レスポンスループ → 正常終了。トランスポートは stdio(ローカル子プロセス、ネットワーク不要)と HTTP + SSE(リモート、マルチクライアント、チーム共有)の二系統が主流です。
| 観点 | MCP | OpenAI Function Calling | LangChain Tools |
|---|---|---|---|
| 標準化 | オープンプロトコル | ベンダー独自 | フレームワーク依存 |
| トランスポート | stdio / HTTP+SSE | HTTP のみ | HTTP のみ |
| クロスモデル | 対応 | 非対応 | 部分的 |
| Resources / Prompts | ネイティブ | 非対応 | 非対応 |
| エコシステム(2026) | 10,000+ Server | 成熟だがロックイン | 成熟だが結合度高 |
MCP は Function Calling の薄いラッパーではありません。AI が実行時にツールを発見・記述・呼び出すためのプロトコル層です。
環境構築と Hello World:venv から Cursor でツールが見えるまで
10分以内に動く MCP Server を用意できます。Python + FastMCP を第一候補とし、TypeScript は @modelcontextprotocol/sdk で同概念を実装します。
| 言語 | SDK | 向いているチーム |
|---|---|---|
| Python | mcp(FastMCP) | バックエンド/AI エンジニア、最短 Hello World |
| TypeScript | @modelcontextprotocol/sdk | Node 基盤のフロント/フルスタック |
python -m venv .venv source .venv/bin/activate pip install mcp npm init -y npm install @modelcontextprotocol/sdk
推奨プロジェクト構成は次のとおりです。
my-mcp-server/ ├── server.py ├── tools/ │ ├── calculator.py │ └── web_search.py ├── resources/ │ └── file_reader.py ├── prompts/ │ └── templates.py ├── tests/ │ └── test_tools.py └── pyproject.toml
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()
公式 MCP Inspector で起動確認します。
python server.py npx @modelcontextprotocol/inspector python server.py
クライアント接続:Claude Desktop の claude_desktop_config.json または Cursor の mcp.json に起動コマンドを登録し、再起動後にツール一覧へ表示されることを確認します。
注意:STDIO Server はクライアント起動中ずっと子プロセスとして動きます。設定には絶対パスを使い、作業ディレクトリ不一致による Hello World 失敗を避けてください。
Tools・Resources・Prompts:本番 Server が公開すべき三層
本番 Server は Tools でアクション、Resources で読み取りデータ、Prompts で再利用テンプレートを登録します。関数シグネチャと docstring が AI 向けドキュメントになり、別途 OpenAPI を書く必要はありません。
Tool 構造:名前は関数名、パラメータは型ヒント、説明は docstring から生成されます。複雑入力には Pydantic モデルを使います。
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="検索キーワード")
max_results: int = Field(default=5, description="最大件数")
language: str = Field(default="ja", description="結果言語")
@mcp.tool()
def web_search(input: SearchInput) -> list[dict]:
...
| 実用 Tool | 用途 | 要点 |
|---|---|---|
| Calculator | 数式評価 | 安全な eval または AST パーサ、文字列で返却 |
| File read/write | ローカル I/O | 許可ディレクトリをホワイトリスト化 |
| HTTP request | 外部 API 呼び出し | httpx で async、タイムアウトとステータス確認 |
| Database query | 読み取り専用 SQL | パラメータ化クエリ、DDL をブロック |
| Time / timezone | 現在時刻・変換 | ISO 8601 文字列で返却 |
import httpx
@mcp.tool()
async def fetch_url(url: str) -> str:
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.get(url)
response.raise_for_status()
return response.text
エラー処理:回復可能な失敗は構造化 dict で返し、回復不能な状態のみ raise します。I/O 系 Tool には必ずタイムアウトを設定し、ファイルシステムや DB アクセス前に権限を検証してください。
Resources は Tools と異なり、URI 経由でデータを供給します。静的 Resource は固定 URI、動的 Resource はパスパラメータを受け取ります。
@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:
user = db.query_user(user_id)
return json.dumps(user)
| Resource 種別 | MIME | 用途 |
|---|---|---|
| Text | text/plain、application/json | 設定、ログ、構造化データ |
| Binary | image/*、application/pdf | ドキュメント、スクリーンショット |
| Streaming | イベントストリーム | ライブメトリクス、ファイル監視 |
ファイルシステム Resource Server はディレクトリ一覧、内容読取、変更イベント購読を提供します。Prompts は動的パラメータ注入付きの会話テンプレートです。
from mcp.types import PromptMessage, TextContent
@mcp.prompt()
def code_review_prompt(language: str, code: str) -> list[PromptMessage]:
return [
PromptMessage(
role="user",
content=TextContent(
type="text",
text=f"次の {language} コードをバグ・セキュリティ・性能の観点でレビューしてください:\n```{language}\n{code}\n```"
)
)
]
マルチターン Prompts は user と assistant ロールを混在させ、面接シミュレーションやデバッグ手順、オンボーディングフローでセッション間の構造を揃えられます。
HTTP トランスポート、認証、デバッグ、自動テスト
ローカル STDIO は開発向きです。チーム共有や SaaS 展開には HTTP + SSE が必要です。FastMCP は streamable-http トランスポートを最小変更でサポートします。
| 特性 | stdio | HTTP + SSE |
|---|---|---|
| デプロイ | ローカル子プロセス | リモートサーバー |
| レイテンシ | ほぼゼロ | ネットワーク依存 |
| マルチクライアント | 1 プロセス 1 クライアント | 多数同時接続 |
| 適した用途 | 個人開発ツール | チーム/本番 SaaS |
mcp = FastMCP("remote-server", transport="streamable-http")
if __name__ == "__main__":
mcp.run(host="0.0.0.0", port=8000)
本番 HTTP Server には認証とガードレールが必要です。Bearer Token または API Key ミドルウェア、既知オリジンに限定した CORS、外部 API や DB に触れる Tool への レート制限 を設定してください。
MCP Inspector は主要デバッグ UI です。Server コマンドに対して起動し、Tool を対話的に呼び出し、JSON-RPC リクエスト/レスポンスを確認してからクライアントに接続します。
import pytest
from mcp.client.session import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client
@pytest.mark.asyncio
async def test_calculator_tool():
server_params = StdioServerParameters(
command="python",
args=["server.py"]
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool("calculate", {"expression": "2 + 2"})
assert result.content[0].text == "4"
| エラー | 原因 | 対処 |
|---|---|---|
| クライアントに Tool が見えない | 設定パスまたはコマンド誤り | mcp.json / claude_desktop_config.json の絶対パスを確認 |
| JSON シリアライズ失敗 | 非シリアライズ可能な戻り値 | str または dict を返却、カスタムオブジェクトを避ける |
| タイムアウト切断 | 同期 Tool 内のブロッキング I/O | async 化、明示タイムアウトを追加 |
| Permission denied | ホワイトリスト外パス | 許可ディレクトリを明示設定 |
本番デプロイ、ナレッジベース事例、エコシステム、六ステップと KVMNODE
Hello World から本番へ進むには、コンテナ化、可観測性、バージョン交渉、実用価値を示す参照プロジェクトが必要です。以下の capstone は 個人ナレッジベース MCP Server — Cursor 内でローカル Markdown を意味検索する例です。
能力の棚卸し:Agent が必要とする DB クエリ、ファイル I/O、内部 API、ビルドトリガーを列挙し、読み取り専用か書き込みかをタグ付けします。
トランスポート選定:ローカル開発は STDIO、複数メンバーや CI Agent が同一 Server を共有する場合は HTTP+SSE と安定ホストを選びます。
実装と Schema:公式 SDK で Tool を登録し、全パラメータと戻り値に JSON Schema を記述します。
クライアント設定:Cursor mcp.json または Claude Desktop 設定に起動コマンドまたはリモート URL を記載し、必要な環境変数を文書化します。
発見と呼び出しテスト:tools/list で全カタログが返ることを確認し、サンプル tools/call チェーンで多段文脈が維持されるか検証します。
本番ホストへデプロイ:Docker でコンテナ化し、Railway/Render で素早く試すか、Cloud Run/Lambda でサーバーレス化するか、Apple ツールチェーン同居と 7×24 が要る場合は専有クラウド Mac を選びます。料金ページを参照してください。
デプロイ選択肢:Docker は Python 依存をきれいに包みます。Railway と Render は個人プロジェクト向けワンクリック展開。AWS Lambda と Google Cloud Run はバースト型サーバーレス向き。既存インフラがあるチームは VPS + Nginx リバースプロキシも有効です。構造化ログ、Tool 呼び出し数の Prometheus メトリクス、Sentry アラート、/health エンドポイントを追加し、ハンドシェイクで MCP プロトコル版と能力を交渉してアップグレード時にクライアントが段階的に縮退できるようにします。
ナレッジベースプロジェクト:ローカル Markdown を ChromaDB または Qdrant で索引し、text-embedding-3-small で埋め込み、watchfiles で変更を監視します。三つの Tool(索引作成、意味検索、ノート更新)と索引ファイル一覧 Resource を公開します。Cursor で「先週 MCP について何を書いた?」と聞けば、Agent が検索 Tool を呼び relevant な断片を返します。
| コミュニティ Server | 能力 |
|---|---|
| mcp-server-filesystem | ディレクトリ一覧、ファイル読み書き |
| mcp-server-github | Issue、PR、コード検索 |
| mcp-server-brave-search | Brave API 経由 Web 検索 |
| mcp-server-postgres | パラメータ化 SQL クエリ |
| mcp-server-slack | チャンネルメッセージ取得・投稿 |
2026年時点で主要 AI クライアントはネイティブ MCP 対応を標準装備しています。マーケットプレイスには数千の Server が掲載され、エンタープライズ採用が OAuth 2.0 認証標準と公開エンドポイントのセキュリティ監査を後押ししています。次の一歩は modelcontextprotocol.io で仕様を読み、最初の Server を公開し、Agent Skill と組み合わせて編成ワークフローを構築することです。
MCP エコシステム規模(2026):公開 MCP Server 数は 10,000 を超え、初期 HTTP Web 成長に匹敵するネットワーク効果が報告されています(openEuler / Jacar コミュニティ集計)。
統合コスト削減:MCP 標準化により、ベンダー別アダプタと比べ AI ツール統合開発コストが 38〜55% 削減されると業界分析(Atlan / WorkOS)で示されています。
参入障壁の低下:標準化された Tool インターフェースにより AI スタートアップの参入障壁が約 62% 低下、従来 SI のカスタム工数は約 43% 減少するという調査結果があります。
| 方式 | 本番 MCP Server | 主な弱点 |
|---|---|---|
| ノート PC + STDIO | ローカル開発が速い | 蓋を閉じると停止、7×24 不可 |
| 汎用 Linux VPS | HTTP+SSE 展開可能 | Apple ツールチェーン非対応、iOS CI 不一致 |
| サーバーレス(Lambda/Cloud Run) | バースト向け低運用 | コールドスタート、ステートフル制限 |
| KVMNODE クラウド Mac + MCP | 専有ノード、launchd、スナップショット復元 | レンタル計画が必要 |
選択肢を正直に並べると、主力 MacBook 上で HTTP+SSE を動かすと蓋を閉じた瞬間にプロセスが落ち、OS アップデートでも中断します。セッションアフィニティのないサーバーレスは多段 Agent 文脈を失いやすいです。認証なしで MCP エンドポイントを公開するとプロンプトインジェクションと不正 Tool 呼び出しを招き、2026年の監査では約 1,000 件の無保護 Server が索引化されています。Apple Silicon、7×24、MCP Server と iOS CI と Agent Gateway の分離が必要なチームには、KVMNODE で専有 Mac Mini M4 または M4 Pro をレンタルする構成が現実的です。日/週/月の柔軟課金、launchd 管理、スナップショットロールバック。料金ページで段階を比較し、手順は ヘルプセンター、MCP スタックに常時ホストが要る場合は 注文ページ からノート PC を閉じた後も稼働する環境を切り離せます。