【基礎編】MCPサーバーの作り方:FastMCPで最小構成からClaude接続まで

【基礎編】MCPサーバーの作り方:FastMCPで最小構成からClaude接続まで

26/06/08 20:23

MCP(Model Context Protocol)サーバーを一から作る手順を、実際に動かしながら解説します。この記事は基礎編です。まず動くサーバーを立て、ツールを1つ公開し、Claudeから呼べるところまでを目標にします。 前提知識は、Pythonの基本(型ヒント、デコレータ、async/await)です。MCPやJSON-RPCの事前知識は要りません。FastMCPがその部分を隠してくれます。

社内データへの接続や一般公開で必須になる認証・権限設計・プロンプトインジェクション対策は、分量も性質も別物なので実装編に分けています。動かせるようになったら、そちらへ進んでください。 【実装編】認証付きMCPサーバーのセキュリティ実装:OAuth 2.1・JWT・最小権限・プロンプトインジェクション対策

MCPサーバーとは何か(最小限の説明)

MCPサーバーは、AI(MCPクライアント)に対して機能を公開する、JSON-RPC 2.0のプロセスです。クライアント(Claude Desktop、claude.ai、Claude Code、Cursorなど)からの要求を受け、結果を返します。

公開できるものは主に3種類です。

  • ツール(Tools):AIが呼び出せる関数。検索、計算、API呼び出しなど。基礎編はこれを中心に扱います。

  • リソース(Resources):AIが読み取れるデータ。ファイルやレコードなど。

  • プロンプト(Prompts):再利用できる定型プロンプト。

通信経路(トランスポート)は2つです。ローカルで動かすstdioと、ネットワーク越しに使うStreamable HTTPです。これは後の節で選びます。

環境を準備する

PythonとFastMCPを用意します。

bash

python -m venv .venv
source .venv/bin/activate    # Windowsは .venv\Scripts\activate
pip install fastmcp

これだけで、サーバーを書く準備は完了です。

最小構成のサーバーを作る

server.py を作り、ツールを1つ持つ最小のサーバーを書きます。

python

from fastmcp import FastMCP

mcp = FastMCP("beyondweb-mcp")  # サーバーの表示名

@mcp.tool
def add(a: int, b: int) -> int:
    """2つの数を足す。正確な計算が必要なときに使う。"""
    return a + b

if __name__ == "__main__":
    mcp.run()   # 引数なしのときは stdio トランスポートで起動する

ポイントは2つです。

  • @mcp.tool を付けた関数が、そのままAIに公開されるツールになります。

  • 型ヒント(a: int)とdocstring(説明文)から、AIが使う入力スキーマと「いつ使うツールか」の説明が自動生成されます。ここを丁寧に書くほど、AIがツールを正しく選び、正しい引数で呼びます。

つまり、ツールの品質は型ヒントとdocstringで決まります。ここが基礎編で最も大事な勘所です。

実用的なツールを書く

足し算だけでは意味がないので、もう少し実用に近い形を見ます。たとえば社内の記事を検索する読み取り専用ツールです。

@mcp.tool
def search_articles(query: str, limit: int = 5) -> list[dict]:
    """サイト記事を検索し、タイトルとURLの一覧を返す。

    社内ナレッジや公開記事から、キーワードに関連するものを探すときに使う。
    """
    results = db.search_articles(query=query, limit=limit)
    return [{"title": r.title, "url": r.url} for r in results]

ツール設計で押さえるべきことは次のとおりです。

  • 1ツール1責務にする。検索・取得・更新を1つの関数に詰め込まない。AIが選びやすく、誤用も減ります。

  • 返すデータを必要最小限にする。内部IDや不要なフィールドを返さない。トークンの無駄も減ります。

  • エラーはAIが解釈できる形で返す。例外で落とすより、「該当なし」「権限がない」といった意味のある結果を返すほうが、AIは次の手を選べます。

  • docstringに「いつ使うか」を書く。機能の説明だけでなく、使いどころを書くと選択精度が上がります。

トランスポートを選ぶ

公開方法を決めます。用途で選びます。

  • stdio:クライアントが必要なときにサーバープロセスを起動し、標準入出力でやり取りします。ローカル専用で、Claude Desktopやコマンドラインツールが想定する方式です。mcp.run() を引数なしで呼ぶとこれになります。

  • Streamable HTTP:サーバーを常駐のWebサービスとして動かし、URLで接続します。リモート公開や、複数クライアントからの利用に向きます。

なお、古いSSE単体のトランスポートは後方互換のために残っているだけで、新規はStreamable HTTPを使います。HTTPで起動する場合はこう書きます。

if __name__ == "__main__":
    mcp.run(transport="http", host="127.0.0.1", port=8000)

HTTPの既定の接続先は http://localhost:8000/mcp/ です。まずローカルで動かすならstdioが手軽で、社内サーバーやclaude.aiのカスタムコネクタとして公開するならStreamable HTTPを選ぶ、と覚えておけば十分です。

ローカルで動かして検証する

Claudeに繋ぐ前に、ツール単体で動作を確認します。FastMCPには検証用のInspector(Web UI)が付いています。

bash

fastmcp dev server.py

ブラウザでInspectorが開き、登録したツールの一覧と、引数を入れて呼び出した結果を確認できます。ここでツールのロジックと入出力を固めてからClaudeに繋ぐと、切り分けが楽になります。

1つ注意点があります。stdioトランスポートのサーバーでは、print() で標準出力に書き込まないでください。標準出力はJSON-RPCの通信路なので、print が混ざると通信が壊れます。ログは標準エラー出力かファイルへ出します。

Claudeに接続する

検証できたら、実際に繋ぎます。方式はトランスポートで分かれます。

ローカル(stdio)でClaude Desktopに繋ぐ

Claude Desktopは設定ファイルにサーバーの起動コマンドを書きます。設定ファイルの場所は次のとおりです。

  • macOS:~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows:%APPDATA%\Claude\claude_desktop_config.json

次のように、サーバーを起動するコマンドを登録します。

{
  "mcpServers": {
    "beyondweb-mcp": {
      "command": "python",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}

Claude Desktopを再起動すると、ツールが認識されます。パスは絶対パスで、Pythonの実行環境(仮想環境のインタプリタ)と一致させてください。ここがずれると起動に失敗します。

リモート(Streamable HTTP)で繋ぐ

HTTPで常駐させたサーバーは、URLで繋ぎます。claude.aiならカスタムコネクタとしてURLを登録し、Claude Codeなら次のように追加できます。

bash

claude mcp add --transport http beyondweb-mcp https://mcp.example.com/mcp/

リモート公開では、リバースプロキシ(CaddyやNginx)でTLSを終端し、サーバープロセス自体は外部に直接公開しないのが基本です。ここはネットワーク設計と認証の話に入るので、実装編で詳しく扱います。

ここまでで「動く」、次は「安全に公開する」

ここまでで、ツールを公開し、Claudeから呼べるMCPサーバーができました。ローカルの実験や、自分だけが使うツールなら、いったんこれで十分です。

ただし、ここから先、社内データに繋ぐ、あるいはインターネットに公開する段階になると、別の設計が必須になります。誰がアクセスできるかの認証、ツールごとの権限制御、ツールが返す外部データに仕込まれた指示を実行しないためのプロンプトインジェクション対策などです。これらを省くと、URLを知った第三者にツールを叩かれ、データを抜かれます。

その実装は、性質も分量も基礎とは別物なので、実装編にまとめています。本番で公開する前に、必ず目を通してください。 【実装編】認証付きMCPサーバーのセキュリティ実装:OAuth 2.1・JWT・最小権限・プロンプトインジェクション対策

まとめ

  • MCPサーバーは、AIにツールを公開するJSON-RPCのプロセス。FastMCPを使えば最小構成は数十行で作れる。

  • ツールの品質は型ヒントとdocstringで決まる。1ツール1責務、返すデータは最小限、エラーは意味のある形で返す。

  • トランスポートはローカルならstdio、リモートならStreamable HTTP。SSE単体は新規で使わない。

  • Claudeに繋ぐ前に fastmcp dev のInspectorでツールを検証する。

  • 社内データ接続や一般公開には、認証・権限・インジェクション対策が必須。実装編へ。

ご相談ください

株式会社コンテクシアは、MCPサーバーの設計・実装から、社内データへの安全なAI連携基盤の構築までを支援しています。自社の業務データをAIから安全に使える形に整えたい方は、お気軽にご相談ください。

無料相談はこちらから


出典・参考(2026年時点)

※本記事は2026年6月時点のFastMCPおよびMCP仕様にもとづきます。FastMCPのAPIとMCP仕様は更新が速いため、実装前に最新の公式ドキュメントをご確認ください。掲載コードは基礎を示す簡略例です。本番利用にはエラー処理・テスト・認証の追加が必要です(実装編を参照)。


よくある質問

この商品について質問がありますか?コミュニティや専門家に質問してください。

このページの内容はいかがだったでしょうか?
担当者に相談する