ゼロから MCP Server を
開発する完全ガイド

FastMCP · 5 Tools · HTTP デプロイ · Inspector デバッグ · ナレッジベース実践

ゼロから MCP Server を開発する:AI ツール呼び出し完全ガイド
Cursor や Claude Desktop に社内 CRM・ナレッジベース・Git リポジトリを接続したい開発者向けに、本稿ではMCP Server を Python FastMCP でゼロから書く手順を整理します。① MCP プロトコルと JSON-RPC 2.0 の通信モデル、② Tools / Resources / Prompts 三能力の実装、③ Hello World から 5 ツール拡張、④ HTTP トランスポート・MCP Inspector デバッグ・Docker デプロイ、⑤ ナレッジベース capstone プロジェクト、⑥ MCP vs Function Calling vs LangChain 比較表と七ステップ Runbook、⑦ 本番ホスト提案までをカバーします。プロトコル全体像はMCP が AI 時代の HTTP となる理由も併読してください。
01

MCP プロトコルとは何か:Host / Client / Server と JSON-RPC 2.0

Model Context Protocol(MCP)は、AI クライアント(Cursor、Claude Desktop、VS Code など)と外部能力(データベース、API、ファイル)を接続するオープン標準です。2024 年 11 月に Anthropic がオープンソース化し、2026 年時点では OpenAI・Google・Microsoft が採用、Linux Foundation 傘下 AAIF がガバナンスを担います。開発者が Server を実装すれば、一度書いたツール定義をすべての MCP クライアントで再利用できます。

アーキテクチャは三層です。Host(ユーザーが操作するアプリ本体)が内部に MCP Client(各 Server との 1:1 セッション)を持ち、MCP Server(あなたが書くコード)が外部システムに橋渡しします。通信はすべて JSON-RPC 2.0 メッセージで行われ、初期化ハンドシェイク後に能力交換(initializeinitialized)が完了します。

JSON-RPC 2.0 — tools/call
{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "search_articles",
    "arguments": { "query": "MCP デプロイ", "limit": 5 }
  },
  "id": 42
}

主要 RPC メソッドは次のとおりです。tools/list で実行時にツール一覧を動的取得、tools/call で実行、resources/list / resources/read で読み取り専用データ取得、prompts/list / prompts/get でテンプレート取得です。トランスポートは STDIO(ローカル子プロセス、開発向け)と Streamable HTTP(リモート・チーム共有向け)の二系統があります。Server 実装者はビジネスロジックに集中し、プロトコル詳細は SDK が吸収します。

MCP Server 開発の本質は「REST エンドポイントを増やすこと」ではなく、「AI が発見・理解・安全に呼び出せる自己記述能力を公開すること」です。

02

Tools / Resources / Prompts:FastMCP Hello World と 5 ツール拡張

MCP Server は三種類の能力を公開します。Toolsは副作用を伴う実行操作(DB クエリ、API 呼び出し)。Resourcesは読み取り専用データ(ドキュメント、設定ファイル)。Promptsは再利用可能なプロンプトテンプレート(要約、QA 形式)です。Python では FastMCP が最短経路を提供します。

Python — Hello World
pip install "mcp[cli]"

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello-server")

@mcp.tool()
def greet(name: str) -> str:
    """指定した名前で挨拶を返します"""
    return f"こんにちは、{name} さん。MCP Server は正常に動作しています。"

if __name__ == "__main__":
    mcp.run()

型ヒントと docstring から JSON Schema が自動生成され、Client 側の Agent がパラメータ意味を理解できます。次にナレッジベース Server へ 5 ツールを追加します。

Python — 5 Tools
@mcp.tool()
def search_articles(query: str, limit: int = 10) -> list[dict]:
    """キーワードで記事を全文検索します"""
    ...

@mcp.tool()
def get_article(article_id: str) -> dict:
    """記事 ID で本文を取得します"""
    ...

@mcp.tool()
def list_categories() -> list[str]:
    """利用可能なカテゴリ一覧を返します"""
    ...

@mcp.tool()
def create_note(title: str, body: str, tags: list[str] | None = None) -> dict:
    """社内メモを新規作成します"""
    ...

@mcp.tool()
def summarize_text(text: str, max_chars: int = 300) -> str:
    """長文を指定文字数以内に要約します"""
    ...

Resourcesは URI スキームで識別されます。ファイルは file:///data/docs/readme.md、カスタムスキームは kb://articles/2026-mcp-guide のように定義し、Client が resources/read で内容を取得します。

Python — Resources URI
@mcp.resource("kb://articles/{article_id}")
def article_resource(article_id: str) -> str:
    return load_markdown(article_id)

@mcp.resource("file://config/{name}")
def config_resource(name: str) -> str:
    return Path(f"./config/{name}.json").read_text(encoding="utf-8")

Promptsは変数付きテンプレートです。Agent が prompts/get で取得し、LLM 入力にそのまま渡せます。

Python — Prompts テンプレート
@mcp.prompt()
def qa_from_context(question: str, context_uri: str) -> str:
    """コンテキスト URI の内容を根拠に QA 形式で回答するプロンプト"""
    ctx = resolve_resource(context_uri)
    return f"""以下のコンテキストのみを根拠に質問に答えてください。
コンテキスト:
{ctx}

質問: {question}"""

@mcp.prompt()
def summarize_article(article_id: str, style: str = "bullet") -> str:
    body = load_markdown(article_id)
    return f"記事を{style}形式で要約してください:\n\n{body}"

設計のコツ:Tools は「書き込み・副作用あり」、Resources は「読み取り専用・キャッシュ可能」、Prompts は「定型ワークフロー」に分離すると、Agent のツール選択精度が向上します。1 つの関数に CRUD 全部を詰め込むより、粒度を細かく公開する方が tools/list の自己記述性が高まります。

03

HTTP トランスポート・MCP Inspector デバッグ・Docker デプロイ

ローカル開発は STDIO で十分ですが、チーム共有や CI 連携では HTTP トランスポートが必要です。FastMCP は mcp.run(transport="streamable-http") で切り替えられ、2026 年仕様では Streamable HTTP が SSE 後継として推奨されています。

Python — HTTP トランスポート
if __name__ == "__main__":
    mcp.run(
        transport="streamable-http",
        host="0.0.0.0",
        port=8080,
        path="/mcp"
    )

MCP Inspectorは公式デバッグ UI です。STDIO と HTTP の両方をテストでき、tools/list の応答、引数バリデーション、エラートレースをブラウザで確認できます。

Shell — MCP Inspector
npx @modelcontextprotocol/inspector python server.py

curl -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

Inspector では Transport を stdio に設定し Command に python、Arguments に server.py を指定します。HTTP モードでは URL に http://localhost:8080/mcp を入力します。tools/call タブで各ツールを手動実行し、JSON Schema 違反を本番接続前に潰せます。

本番デプロイは Docker が定番です。非 root ユーザー、ヘルスチェック、環境変数による秘密情報注入を含めます。

Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY server.py .
RUN useradd -m mcpuser
USER mcpuser
EXPOSE 8080
HEALTHCHECK CMD curl -f http://localhost:8080/mcp || exit 1
CMD ["python", "server.py"]
Shell — Docker 起動
docker build -t kb-mcp-server .
docker run -d --name kb-mcp -p 8080:8080 \
  -e DATABASE_URL="postgresql://..." \
  -e API_KEY="sk-..." \
  kb-mcp-server

セキュリティ:本番 HTTP エンドポイントをインターネットに裸露出しないでください。2026 年時点で約 1,000 件の未認可 MCP Server が公開索引されており、OAuth 2.1 標準化はロードマップ進行中です。Tailscale・VPN・リバースプロキシ認証の背後に置くのが最低ラインです。

04

Capstone:社内ナレッジベース MCP Server とエコシステム Server

ここまでの要素を統合した社内ナレッジベース MCP Serverが capstone プロジェクトです。Markdown 記事を kb:// Resources として公開し、search_articles / get_article Tools で Agent が RAG なしでも構造化検索でき、qa_from_context Prompt で回答形式を統一します。PostgreSQL にメタデータ、ベクトル検索は pgvector または外部 Embedding API を Tool 内で呼び出す構成が 2026 年の実務標準です。

01

データ層:記事テーブル(id, title, body, tags, updated_at)と全文索引。Embedding 列は optional。

02

Resources 層:各記事を kb://articles/{id} で公開。Agent は read-only コンテキストとして先に読み込めます。

03

Tools 層:検索・取得・メモ作成・要約の 5 ツール。副作用は create_note のみに限定。

04

Prompts 層:QA・要約・比較分析の 3 テンプレートでチームの出力品質を均一化。

05

Client 接続:Cursor の .cursor/mcp.json または Claude Desktop 設定に Server を登録。起動時 tools/list で自動発見。

自前実装以外に、エコシステムには 10,000 超の公開 MCP Server があります。よく使われる代表例を下表にまとめます。

Server用途接続方式
@modelcontextprotocol/server-filesystemローカルファイル読み書きSTDIO
@modelcontextprotocol/server-githubIssue / PR / リポジトリ操作STDIO + PAT
@modelcontextprotocol/server-postgresPostgreSQL 読み取りクエリSTDIO
@modelcontextprotocol/server-slackチャンネル投稿・履歴取得STDIO + OAuth
@modelcontextprotocol/server-brave-searchWeb 検索STDIO + API Key
自社 kb-mcp-server社内ドキュメント統合HTTP + Docker

エコシステム Server を組み合わせ、Filesystem + GitHub + 自社 KB を同一 Cursor セッションに載せる「開発者デスク構成」が 2026 年の主流ワークフローです。自社 Server は差別化資産として残し、汎用部分は npm 公式 Server をそのまま利用するのがコスト最小です。

05

MCP vs Function Calling vs LangChain:比較表と七ステップ Runbook

「既存の Function Calling や LangChain Tools で足りるのでは?」という疑問に答えるため、三方式を Agent 統合の観点で比較します。

次元MCPFunction CallingLangChain Tools
標準化業界オープン標準(AAIF)各 LLM ベンダー独自 JSON Schemaフレームワーク内部抽象
クライアント互換Cursor / Claude / ChatGPT / VS Code 等単一ベンダー API のみLangChain ランタイム依存
ツール発見tools/list 動的取得プロンプトに静的注入コード内ハードコード
データ公開Resources URI + Promptsなし(別途 RAG)Retriever チェーン別途
トランスポートSTDIO / HTTP 標準化HTTPS API 内包プロセス内関数呼び出し
ベンダー切替コストServer 層は不変スキーマ・呼び出し形式を全面書換Agent チェーン再構成
適用シナリオマルチクライアント恒久統合単一 API クイック試作Python バックエンド Agent パイプライン

以下の七ステップ Runbookをそのままチーム Runbook に貼り付けて評価から本番まで進められます。

01

統合対象の棚卸し:接続したいシステム(DB、Git、Slack、社内 Wiki)と利用 LLM クライアント(Cursor / Claude Desktop)をリスト化し、現行 Function Calling の重複を数えます。

02

FastMCP Hello World:pip install "mcp[cli]" → 1 ツール Server → MCP Inspector で tools/list 確認。ここまで 30 分以内が目安です。

03

三能力設計:Tools(副作用あり)/ Resources(読取)/ Prompts(定型)に分類。5 ツール以内から開始し、過剰公開を避けます。

04

Client 接続テスト:Cursor mcp.json に STDIO 登録。実際の Agent タスクでツール選択精度を評価します。

05

HTTP + Docker 化:チーム共有が必要になった段階で Streamable HTTP に切替。Docker イメージに秘密情報を ENV 注入。

06

セキュリティ監査:公開範囲、OAuth / VPN、Tool ごとの権限スコープ、監査ログを定義。未認可裸露出は禁止。

07

7×24 ホストデプロイ:ステートフルセッション維持のため専用ホストへ移行。MESHLAUNCH Mac Mini で MCP Server + IDE Agent を同居させ、ノート PC スリープ問題を排除。

2026 年時点の参考データは次の三つです。

A

10,000+ 公開 MCP Server:エコシステム目録は毎週数百件ペースで増加。自社 Server 1 件追加で全 MCP クライアントが即利用可能なネットワーク効果があります。

B

統合開発コスト 38–55% 削減:企業 AI 統合プロジェクトで MCP 採用チームの平均削減率(2025–2026 業界調査)。Function Calling ベンダーごとの二重実装が解消されます。

C

FastMCP 初回 PoC 中央値 4.2 時間:Hello World から Cursor 接続までの開発者自己申告データ(n=280、2026 Q1 コミュニティ調査)。LangChain フル Agent 構築の 2.1 日と比較して大幅に短縮されます。

ノート PC 上の STDIO Server はスリープ一発でセッションが切れます。Linux VPS は Apple Silicon 最適化推論や Xcode ビルドをネイティブ実行できません。MCP Server と Cursor / Claude Code を 7×24 同居させる本番構成では、MESHLAUNCH の Mac Mini M4 クラウドレンタルが合理的です。専有 Apple Silicon、日/週/月の柔軟契約、料金ページで即見積もり可能。デプロイ障害はヘルプセンターも参照してください。

よくある質問

FastMCP は公式 mcp パッケージ上の高レベルラッパーです。@mcp.tool() デコレーターで JSON Schema が自動生成され、STDIO と HTTP を同一コードで切り替えられます。低レベル SDK は RPC ハンドラを手書きする必要がありますが、FastMCP なら Hello World から本番まで最短経路で進められます。

ローカル STDIO は開発専用です。本番では HTTP トランスポート + Docker、または systemd / pm2 による常駐化が必要です。ステートフルセッションを維持するにはスリープしない専用ホストを推奨します。MESHLAUNCH Mac Mini レンタルは MCP Server と Cursor を同一 Apple Silicon ノードで常駐させる構成に適しています。

① Python 仮想環境と mcp パッケージのバージョン一致、② STDIO モードでは Transport を stdio、Command を python、Arguments を server.py に設定、③ HTTP モードではポート競合と認証ヘッダー、④ tools/list が空の場合はデコレーターのインポート漏れを確認してください。ネットワーク・SSH 問題はヘルプセンターを参照してください。

Function Calling は単一 LLM ベンダーにバインドされます。MCP Server を一度実装すれば Cursor、Claude Desktop、ChatGPT、VS Code などすべての MCP クライアントで再利用でき、tools/list による実行時発見と Resources / Prompts の統合公開が可能です。ベンダー切替時のツール層書き換えコストを 38–55% 削減できると業界調査は示しています。