MCP Server をゼロから構築する:
開発者のための完全ガイド

大規模言語モデルは、単体では社内データベースを問い合わせたり、ローカルファイルを読み取ったり、内部 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.0stdio(ローカル・低レイテンシ)または HTTP + SSE / Streamable HTTP(リモート・マルチクライアント)で運びます。ライフサイクルはハンドシェイク → 能力交渉 → リクエスト処理 → シャットダウンです。
MCP vs OpenAI Function Calling vs LangChain Tools
観点 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 を使います。

setup.sh
python -m venv .venv
source .venv/bin/activate
pip install mcp

npm init -y
npm install @modelcontextprotocol/sdk

プロジェクト構成:server.pytools/resources/prompts/tests/pyproject.toml を用意します。

デバッグ環境:公式 MCP Inspectornpx @modelcontextprotocol/inspector)、Claude Desktop は claude_desktop_config.json、Cursor は Settings → MCP から接続します。

server.py
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_webread_file)が推奨です。

複雑な入力:Pydantic BaseModel で型安全な入力を定義できます。

tools/web_search.py
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 defhttpx.AsyncClient を使い、stdio イベントループのブロックを避けます。本番向けには生の例外ではなく errorcode を含む構造化エラーを返し、タイムアウトと権限チェックを追加します。

04 Resources と Prompts:データ供給と再利用テンプレート

Resource vs Tool:Resource はデータ提供者(AI が読み取る)、Tool はアクション実行者(AI が呼び出す)です。Resource は URI でアドレス指定します:file://http://custom://

resources.py
@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/plainapplication/json)、バイナリ(画像・PDF)、ストリーミング(リアルタイムデータ)に対応します。ファイルシステム Resource Server では、ディレクトリ一覧、ファイル読み取り、変更イベント購読が実装できます。

Prompts:パラメータ注入可能な再利用プロンプト断片で、チームの Prompt 一貫性を高めます。userassistant ロールを含む多ターン テンプレートは、コードレビュー、面接シミュレーション、デバッグアシスタントに適しています。

05 HTTP トランスポート、デバッグ、本番デプロイ

stdio vs HTTP + SSE 選定
特性 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 / Qdranttext-embedding-3-smallwatchfiles を組み合わせ、Cursor で「先週 MCP について何を書いた?」と聞けば Agent が検索ツールを呼び出します。

2026 年の参考 Server:mcp-server-filesystemmcp-server-githubmcp-server-brave-searchmcp-server-postgresmcp-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

  1. 言語とトランスポートを決める:個人開発は Python + stdio、チーム共有は HTTP + Streamable HTTP。
  2. モジュール骨格を組む:tools / resources / prompts に分割し、MCP Inspector を導入。
  3. Hello World を接続確認:Cursor または Claude Desktop でツールの可視性と呼び出しを検証。
  4. 五類 Tools と Resource を拡張:読み取り専用から始め、書き込みと外部 API を段階追加。
  5. テストと Docker を自動化:CI で stdio 統合テストを実行。
  6. 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 から始めてみてください。