mcpField
F
fastapi

fastapi

github.com/claude-dev-suite開発4651 回インストール今日更新
リポジトリ

fastapi について

fastapiは、FastAPIでAPIを開発する人向けのリファレンススキルです。ルート、依存性注入、検証、非同期処理、本番運用の例とトラブルシューティングを扱います。

主な機能

  1. 01ルートとレスポンスモデルのパターン
  2. 02依存性注入の例
  3. 03Pydanticによる検証の指針
  4. 04非同期開発の推奨事項
  5. 05本番運用準備とトラブルシューティング

活用シーン

  1. 01FastAPIのルートとレスポンスの構成
  2. 02検証と依存性注入の追加
  3. 03APIの本番運用準備の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill fastapi

インストール後、Claude Code で/fastapiを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

advanced.md
quick-ref/
dependencies.md
pydantic.md

詳細

FastAPI コアナレッジ

完全なリファレンス:接続管理、認証、ルーム管理、Pydantic メッセージプロトコル、ハートビート、Redis pub/sub によるスケーリング、バックグラウンドタスクなど、WebSocket 統合については advanced.md を参照してください。

詳細なナレッジ:包括的なドキュメントについては、technology に fastapi を指定して mcp__documentation__fetch_docs を使用してください。

基本設定

from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel, EmailStr

app = FastAPI(title="My API")

class UserCreate(BaseModel):
    name: str
    email: EmailStr

class User(UserCreate):
    id: int

    class Config:
        from_attributes = True

ルートのパターン

@app.get("/users", response_model=list[User])
async def get_users(skip: int = 0, limit: int = 100):
    return await db.users.find_many(skip=skip, limit=limit)

@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int):
    user = await db.users.find(user_id)
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    return user

@app.post("/users", response_model=User, status_code=201)
async def create_user(user: UserCreate):
    return await db.users.create(user.model_dump())

依存性注入

async def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

async def get_current_user(token: str = Depends(oauth2_scheme)):
    user = await verify_token(token)
    if not user:
        raise HTTPException(status_code=401, detail="Invalid token")
    return user

@app.get("/me", response_model=User)
async def get_me(user: User = Depends(get_current_user)):
    return user

主な機能

  • /docs に OpenAPI/Swagger ドキュメントを自動生成
  • Pydantic によるバリデーション
  • 非同期処理をサポート
  • あらゆる箇所で型ヒントを使用

このスキルを使用しないケース

  • Django プロジェクト - Django には独自の ORM、管理画面、テンプレートがあります
  • Flask マイクロサービス - Flask は型バリデーションのオーバーヘッドがなく、より軽量です
  • 同期型 WSGI アプリ - FastAPI は非同期処理を優先します
  • レガシーな Python 2.x - FastAPI には Python 3.7 以降が必要です
  • REST 以外の API - 専用の GraphQL または gRPC フレームワークを使用してください

アンチパターン

アンチパターン問題点解決策
async def ではなく def を使うイベントループをブロックしますI/O 操作には async def を使用してください
response_model を指定しない出力が検証されません必ず response_model を指定してください
同期型のデータベース呼び出しワーカーをブロックします非同期ドライバー(asyncpg、motor)を使用してください
ロックなしでグローバル状態を使う競合状態が発生しますasyncio.Lock または Depends() を使用してください
HTTPException を使わずに例外を送出する汎用的な 500 エラーが発生しますステータスコードを指定して HTTPException を使用してください
入力を検証しないセキュリティ上の脆弱性につながりますバリデーター付きの Pydantic モデルを使用してください

トラブルシューティング(クイックガイド)

問題診断対処法
"RuntimeError: no running event loop"同期コードから非同期処理を呼び出していますawait または asyncio.run() を使用してください
バリデーションエラーが分かりにくいフィールドの説明がありませんField(description=...) を追加してください
応答時間が遅い同期型のデータベース呼び出しが原因です非同期 SQLAlchemy に切り替えてください
ブラウザーで CORS エラーが発生するミドルウェアがありませんCORSMiddleware を追加してください
依存関係が注入されないインポートまたは構文が間違っていますDepends() の構文を確認してください

本番環境への対応

セキュリティ設定
from fastapi.middleware.cors import CORSMiddleware
from slowapi import Limiter

app = FastAPI(
    title="My API",
    docs_url="/docs" if os.getenv("ENV") != "production" else None,
)

limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter

app.add_middleware(
    CORSMiddleware,
    allow_origins=os.getenv("ALLOWED_ORIGINS", "").split(","),
    allow_credentials=True,
    allow_methods=["GET", "POST", "PUT", "DELETE", "PATCH"],
    allow_headers=["*"],
)
ヘルスチェック
@app.get("/health")
async def health():
    return {"status": "healthy"}

@app.get("/ready")
async def readiness(db: Session = Depends(get_db)):
    try:
        db.execute("SELECT 1")
        return {"status": "ready", "database": "connected"}
    except Exception:
        return JSONResponse(status_code=503, content={"status": "not ready"})
グレースフルシャットダウン
from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app: FastAPI):
    await database.connect()
    yield
    await database.disconnect()

app = FastAPI(lifespan=lifespan)
モニタリング指標
指標アラートしきい値
リクエストレイテンシ p99> 500ms
エラー率(5xx)> 1%
メモリ使用率> 80%
ワーカー使用率> 90%
チェックリスト
  • CORS が適切に設定されている
  • レート制限が有効になっている
  • セキュリティヘッダー用ミドルウェアがある
  • すべての入力に Pydantic バリデーションを適用している
  • ヘルス/レディネス/ライブネスのエンドポイントがある
  • 構造化ログ(JSON 形式)を使用している
  • グローバル例外ハンドラーがある
  • シークレットを環境変数で管理している
  • 本番環境ではドキュメントを無効にしている
  • 複数のワーカーで Gunicorn を使用している
  • グレースフルシャットダウンを処理している

リファレンスドキュメント

コメント