🧠

FastAPI-MCPで任意のツール名を設定する

に公開

前回はFastAPI‐MCPを使って初めてのMCPサーバーを構築しました。

https://zenn.dev/kmiura55/articles/fastapi-mcp-starting

で、この記事があまりにもバズってしまい今まで書いた記事の中で一番ファボがついていましたw

これでMCPを完全理解した!ということで、自分でもMCPを使ったアプリケーションを実装していましたが、その中で詰まったことを小ネタ的に紹介します。

きっかけ

本格的に複数のエンドポイントを用意してからMCPサーバーを起動して、Claude Desktopと接続すると以下のエラーが出ました。

どうやらClaudeでMCPのツール名は64文字までしか受け付けないようです。

FastAPI-MCPのツール名を変更する

FastAPI-MCPでは、デフォルトだと関数名、メソッド名、エンドポイントで設定されます。

例えば、以下のエンドポイントを実装した場合はMCPのツール名としては punch_in_companies__company_id__post になります。

@router.post("/companies/{company_id}", response_model=Attendance)
def punch_in(
    company_id: int,
    db: Session = Depends(get_db)
) -> Attendance:
    attendance = crud.create_attendance(db, company_id)
    return attendance

この規則で命名すると、重複することはないですがエンドポイントが長くなればその分ツール名が長くなってエラーになってしまいます。なので、エンドポイントを短くしないといけないのかというとそれじゃRESTfulなAPIじっそうではなくなります。

そこで、以下のドキュメントを参考にAPIのルーティングの引数 operation_id を指定することで、任意のツール名が設定することができます。ちなみにこれが公式で推奨されている命名方法だそうです。

https://fastapi-mcp.tadata.com/configurations/tool-naming

というわけで先ほどのエンドポイントを以下のように書き換えることで punch_in_companies がこのエンドポイントをMCPで呼び出すときのツール名になります。

@router.post(
    "/companies/{company_id}",
    response_model=Attendance,
    operation_id="punch_in_companies"
)
def punch_in(
    company_id: int,
    db: Session = Depends(get_db)
) -> Attendance:
    attendance = crud.create_attendance(db, company_id)
    return attendance

ドキュメントをよく読めばわかることではありますが、FastAPIのアプリケーションをMCPサーバー化するときには地味に躓くかもと思いながら記事にしたためました。

Discussion