TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

自作MCPサーバでOAuth認証を実装する

公式のPython SDKでは、OAuth認証について簡単な記載があるが、詳細な実装方法までは記載されていない。

自分で外部IdPで認証する処理を実装して、Googleの認証プロバイダを使用して試行錯誤してみたが、VSCodeGitHub Copilotで動かすことができなかった。

公式のPython SDKは、Fast MCPのV1が採用されているが、本家のFast MCPはV2がリリースされている。

Fast MCPはV2では、OAuth認証が認証プロバイダ別に準備されており、簡単に実装できるようになっている。

ここでは、Fast MCP V2で、Googleの認証プロバイダで認証する処理を実装する。

Fast MCP V2のインストール

Fast MCP V2を使う場合は、公式のPython SDKのインストールは不要である。

uv add fastmcp

OAuth認証の実装

認証プロバイダにGoogleを使用する際の実装する例、以下の通り。
READMEにも記載がある通り、認証処理が数行で書ける。

import os

from fastmcp import FastMCP
from fastmcp.server.auth.providers.google import GoogleProvider

CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID")
CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET")
BASE_URL = os.getenv("BASE_URL", "http://localhost:8000")

auth = GoogleProvider(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, base_url=BASE_URL)
mcp = FastMCP(name="Demo", auth=auth)


# --- tools/resources/prompts ---
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers"""
    return a + b


# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """Get a personalized greeting"""
    return f"Hello, {name}!"


# Add a prompt
@mcp.prompt()
def greet_user(name: str, style: str = "friendly") -> str:
    """Generate a greeting prompt"""
    styles = {
        "friendly": "Please write a warm, friendly greeting",
        "formal": "Please write a formal, professional greeting",
        "casual": "Please write a casual, relaxed greeting",
    }

    return f"{styles.get(style, styles['friendly'])} for someone named {name}."

実行方法

STDIOモードの場合
fastmcp run server.py
Streamable HTTPの場合
fastmcp run server.py --transport http --port 8000

Googleの認証設定

Google Cloudのコンソールから、APIとサービスを選択し、認証情報からOAuth 2.0 クライアント IDを追加する。

承認済みの JavaScript 生成元に「http://127.0.0.1:8000」を設定する。

承認済みのリダイレクト URIに、「http://localhost:8000/auth/callback」を設定する。

VSCodeMCPサーバを登録

GitHub Copilotから実行する場合は、F1キーを押して、「MCP: Add Server...」を選択して、「HTTP (HTTP or Server-Sent Events」を選択する。

URLに、「http://127.0.0.1:8000/mcp」を入力する。

サーバIDを入力する(デフォルトのままでも良い)。

設定の保存先を選択する(ここではWorkspaceを選択)。

認証の許可を求めるダイアログが表示されるので、Allowを押す。

ブラウザでGoogleの認証ページが開くので、Googleアカウントを選択して認証する。

認証が完了すると、Visual Studio Codeを開くか確認するダイアログが表示されるので、[Visual Studio Codeを開く]を押す。

これで、VSCodeMCPサーバが使えるようになる。


GitHub Copilotで、「#add」が使えることを確認する。

MCPサーバを起動したコンソールのログにもアクセスがあったことが確認できる。

INFO:     127.0.0.1:43528 - "POST /mcp HTTP/1.1" 200 OK

uvicornで起動する

上記の手順では、fastmcpコマンドでサーバを起動しているが、内部的にはuvicornのライブラリが使用されている。

直接uvicornや、他のASGIサーバからも起動できる。

uvicornで起動する場合は、ソースの末尾に以下の行を追加する。

app = mcp.http_app()

以下のコマンドで起動する。

uvicorn --lifespan on server:app

環境変数GOOGLE_CLIENT_IDとGOOGLE_CLIENT_SECRETを設定すること

注意

VSCodeのデバッガで、uvicornをモジュールとして起動することもできたが、GitHub Copilotからの接続ができなかった。

MCP Inspector

公式Python SDKと同様に、MCP Inspectorで実行できる。

fastmcp dev server.py

まとめ

MCPサーバでOAuth認証を実装する方法について記載した。
Fast MCP V2を使うことでOAuth認証を簡単に実装できる。

今回は、ローカルでの実行しか試していないので、外部公開する場合は別の手順が必要になる可能性がある。
その場合は、追記する予定である。


以上