FastAPI-MCPで構築するシンプルなMCPサーバー

Posted on 2025/08/12

ToC

MCPサーバーとは

MCP(Model Context Protocol)サーバーは、AIアプリケーションと外部データソースやツールを接続するための統一プロトコルです。Claude、ChatGPT、その他のAIモデルが外部システムと安全に相互作用できるようにする仕組みです。

MCPサーバーが有用である理由

AI利用において、MCPサーバーが重要な役割を果たす理由は複数あります。

まず、統一されたインターフェースの提供により、Claude、ChatGPT、その他のAIモデルが同じプロトコルで外部システムにアクセスできるようになります。
MCPサーバーにて、認証・認可機能を統一的に実装することで、AIアプリケーションのセキュリティを一元管理できるようになります。また、複数のAIクライアントが同一のMCPサーバーを利用できるため、新しいAIモデルやクライアントを追加する際も、既存のMCPサーバーを活用して、開発コストを抑制することもできます。

/posts/2025/08/img/mcp_hu_83bb8517d3bf0aa9.png

プロトコルは、Server-Sent Events(SSE)やstreamable HTTPで標準化されているため、相互運用性が確保され、異なるベンダーのAIソリューション間でのデータ連携や機能統合が容易になり開発効率も大幅に向上します。

MCPサーバーの構築

基本的なMCPサーバーを構築してみます。
FastAPI-MCPライブラリを使用することで、シンプルなコードでMCPサーバーを構築できます。ライブラリの活用により、MCPプロトコルの複雑な実装を抽象化して、本質的な機能開発に集中できるように設計されています。

from fastapi import FastAPI, Query, HTTPException
from fastapi_mcp import FastApiMCP
import uvicorn

app = FastAPI()
mcp = FastApiMCP(app)
mcp.mount_sse(app, "/sse")
mcp.mount_http(app, "/mcp")

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

このコードはシンプルですが、FastAPI-MCPライブラリによって、MCPの標準仕様に準拠したサーバーを構築できます。
Server-Sent Eventsの/sseとstreamable HTTPの/mcpの2つのエンドポイントが自動で作成され、MCPクライアントからの接続を受け付ける準備が整います。
さらに、既存のFastAPIエンドポイントとMCPが共存できるため、従来のREST APIとMCPプロトコルを同一のサーバーで提供することが可能です。

MCPクライアントの設定

構築したMCPサーバーが想定した動きになっているかを確認するためにMCPクライアントが必要です。 MCPサーバーの開発において、MCP Inspector は便利なテストツールとして設計されています。このツールは、MCPサーバーの動作確認、デバッグ、機能テストを効率的に行うための機能をもっています。

MCP Inspectorは、複数の接続方式(stdio、SSE、streamable HTTP)でMCPサーバーに接続することができます。また、UIモードとCLIモードの両方をサポートしている点は特筆すべき特徴です。 認証機能に関しても充実しており、Bearer トークン認証をサポートし、SSE接続における認証ヘッダーのカスタマイズも可能です。

MCP Inspectorのインストールと実行

MCP Inspectorの導入は非常に簡単で、npmを使用してすぐに利用開始できます。インストールや詳細な使用方法については、READMEに詳しい手順が記載されています。 下記のコマンドにより、サーバーが起動し、http://localhost:6274 でWebUIにアクセスできるようになります。

npx @modelcontextprotocol/inspector

MCP Inspectorから構築したMCPサーバーにアクセス

早速、MCPサーバーにアクセスしてみましょう。 MCP Inspectorの画面でTransport TypeとエンドポイントのURLを設定します。
なお、SSEの場合はhttp://localhost:8000/sseをStreamable HTTPの場合はhttp://localhost:8000/mcpを指定します。認証機能のないMCPサーバーのため、これ以外には特別な設定は必要ありません。
早速、Connectで接続してみてください。接続できると、Connectedの表示がされます。簡単に接続できます。

MCPサーバーのメソッドにアクセス

アクセスするだけだと今ひとつよくわからない部分もありますので、サンプルのtoolメソッドを一つ追加しておきます。内容はシンプルです。言語コードを渡すと、それぞれの言語でHello worldを得ることができます。サポート外の言語を指定すると、エラーになります。

@app.get("/hello", tags=["tool"], operation_id="get_hello_world")
async def hello_world(language: str = Query("ja", description="言語コード: ja, en, zh")):
    messages = {
        "ja": "こんにちは 世界",
        "en": "Hello world",
        "zh": "你好,世界"
    }
    if language not in messages:
        raise HTTPException(status_code=400, detail=f"language '{language}' is not supported.")
    return {"message": messages[language]}

MCP Inspectorの画面のToolsのタブを選択して、List toolsを選択するとMCPサーバーで利用可能なツールの一覧が表示されます。
今回の場合でいうと、get_hello_worldが表示されます。ツールを選択すると、さらに右側のウインドウでツール実行ができるようになります。パラメータを設定して任意の言語コードを引数にして実行すると、MCPサーバーからJSON形式のレスポンスが戻ってくることを確認することができます。

/posts/2025/08/img/mcp-inspector-simple_hu_4d6510eb43fe4924.png

参考リンク