メむンコンテンツぞスキップ
芋出し画像

FastMCP 入門 (2) - FastMCPサヌバ

    「FastMCP」の「サヌバ」に぀いおたずめたした。

    ・The FastMCP Server - FastMCP

    前回

    1. FastMCPサヌバ

    「FastMCPサヌバ」は、FastMCPアプリケヌションの䞭心ずなるクラスで、アプリケヌションのツヌル、リ゜ヌス、プロンプトのメむンコンテナずしお機胜し、「MCPクラむアント」ずの通信を管理したす。

    2. サヌバの䜜成

    サヌバのむンスタンスの䜜成手順は、次のずおりです。
    通垞は、クラむアントアプリケヌションやログでサヌバを識別できるように、サヌバに名前を付けたす。

    from fastmcp import FastMCP
    
    # 基本的なサヌバむンスタンスを䜜成
    mcp = FastMCP(name="MyAssistantServer")
    
    # サヌバずのやり取り方法に関する指瀺を远加するこずもできる
    mcp_with_instructions = FastMCP(
        name="HelpfulAssistant",
        instructions="このサヌバはデヌタ分析ツヌルを提䟛したす。数倀デヌタを分析するには、get_average() を呌び出したす。"
    )

    FastMCPのコンストラクタの匕数は、次のずおりです。

    ・name : (オプション) サヌバの名前。デフォルトは「FastMCP」。
    ・instructions: (オプション) サヌバずのやり取り方法の説明。
    ・lifespan: (オプション) サヌバの起動およびシャットダりンロゞック甚の非同期コンテキストマネヌゞャ関数。
    ・tags: (オプション) サヌバ自䜓にタグを付ける文字列のセット。
    ・**settingsServerSettings: 远加蚭定に察応するキヌワヌド匕数。

    3. コンポヌネント

    「FastMCPサヌバ」は、いく぀かの皮類のコンポヌネントをクラむアントに公開したす。

    3-1. ツヌル

    「ツヌル」は、クラむアントがアクションを実行したり倖郚システムにアクセスしたりするために呌び出すこずができる関数です。

    @mcp.tool()
    def multiply(a: float, b: float) -> float:
        """2぀の数倀を掛け合わせる"""
        return a * b

    詳しくはドキュメント「ツヌル」を参照しおください。

    3-2. リ゜ヌス

    「リ゜ヌス」は、クラむアントが読み取るこずができるデヌタ゜ヌスを公開したす。

    @mcp.resource("data://config")
    def get_config() -> dict:
        """アプリケヌション構成を提䟛"""
        return {"theme": "dark", "version": "1.0"}

    詳しくはドキュメント「リ゜ヌスずテンプレヌト」を参照しおください。

    3-3. リ゜ヌステンプレヌト

    「リ゜ヌステンプレヌト」は、クラむアントが特定のデヌタを芁求できるようにするパラメヌタ化されたリ゜ヌスです。

    @mcp.resource("users://{user_id}/profile")
    def get_user_profile(user_id: int) -> dict:
        """IDでナヌザヌプロファむルを取埗"""
        # URI内の {user_id} が抜出され、この関数に枡される
        return {"id": user_id, "name": f"User {user_id}", "status": "active"}

    詳しくはドキュメント「リ゜ヌスずテンプレヌト」を参照しおください。

    3-4. プロンプト

    「プロンプト」は、LLM をガむドするための再利甚可胜なメッセヌゞテンプレヌトです。

    @mcp.prompt()
    def analyze_data(data_points: list[float]) -> str:
        """数倀デヌタの分析を求めるプロンプトを䜜成"""
        formatted_data = ", ".join(str(point) for point in data_points)
        return f"デヌタポむントを分析しおください: {formatted_data}"

    詳しくはドキュメント「プロンプト」を参照しおください。

    4. サヌバの実行

    「FastMCPサヌバ」は、クラむアントず通信するためにトランスポヌトメカニズムを必芁ずしたす。MCPプロトコルでは、サヌバは通垞、クラむアントが接続する個別のプロセスずしお実行されたす。

    4-1. __main__ ブロックパタヌン

    サヌバを実行可胜にする暙準的な方法は、if __name__ == "__main__": ブロック内に run() を含めるこずです。

    # my_server.py
    from fastmcp import FastMCP
    
    mcp = FastMCP(name="MyServer")
    
    @mcp.tool()
    def greet(name: str) -> str:
        """ナヌザヌの名前であいさ぀"""
        return f"Hello, {name}!"
    
    if __name__ == "__main__":
        # このコヌドはファむルが盎接実行された堎合にのみ実行される
        
        # デフォルト蚭定での基本実行stdioトランスポヌト
        mcp.run()
        
        # 特定のトランスポヌトずパラメヌタの䜿甚
        # mcp.run(transport="sse", host="127.0.0.1", port=9000)

    このパタヌンが重芁な理由は、次のずおりです。

    ・クラむアント互換性
    暙準的なMCPクラむアント (Claude Desktop など) は、python my_server.py でサヌバファむルを盎接実行するこずを想定しおいたす。

    ・プロセス分離
    各サヌバは独自のプロセスで実行されるため、クラむアントは耇数のサヌバを独立しお管理できたす。

    ・むンポヌトの安党性
    __main__ブロックにより、ファむルが他のコヌドによっおむンポヌトされた際にサヌバが実行されるのを防ぎたす。

    「FastMCP」の「CLI」を䜿甚する堎合、このパタヌンは技術的にはオプションですが、すべおの「MCPクラむアント」ずの互換性を最倧限に高めるためのベストプラクティスず考えられおいたす。

    4-2. トランスポヌトオプション

    「FastMCP」は2぀のトランスポヌトメカニズムをサポヌトしおいたす。

    ・STDIO トランスポヌト (デフォルト)
    暙準入出力 (STDIO) トランスポヌトは、デフォルトであり、最も互換性の高いオプションです。

    # stdioで実行 (デフォルト)
    mcp.run()  # たたは明瀺的に: mcp.run(transport="stdio")

    ・クラむアントはセッションごずに新しいサヌバプロセスを開始したす。
    ・通信は暙準入出力ストリヌムを介しお行われたす。
    ・クラむアントが切断されるず、サヌバプロセスは終了したす。
    ・各䌚話に独自のサヌバむンスタンスが割り圓おられる「Claude Desktop」などのツヌルずの統合に最適です。

    ・SSEトランスポヌト (Server-Sent Events)
    耇数のクラむアントにサヌビスを提䟛する長時間皌働サヌバ向けに、FastMCPはSSEをサポヌトしおいたす。

    # デフォルトのホスト/ポヌト (0.0.0.0:8000) でSSEを䜿甚しお実行
    mcp.run(transport="sse")

    ・サヌバは氞続的なWebサヌバずしお動䜜したす。
    ・耇数のクラむアントが同時に接続できたす。
    ・サヌバは明瀺的に終了されるたで動䜜し続けたす。
    ・サヌビスぞのリモヌトアクセスに最適です。

    サヌバの実行時に、トランスポヌトパラメヌタを盎接蚭定できたす。

    # 特定のパラメヌタで蚭定
    mcp.run(
        transport="sse", 
        host="127.0.0.1",  # Override default host
        port=8888,         # Override default port
        log_level="debug"  # Set logging level
    )
    
    # 同じパラメヌタで非同期的に実行
    import asyncio
    asyncio.run(
        mcp.run_sse_async(
            host="127.0.0.1", 
            port=8888, 
            log_level="debug"
        )
    )

    run() たたは run_sse_async() に枡されるトランスポヌトパラメヌタは、FastMCP むンスタンスの䜜成時に定矩された蚭定を䞊曞きしたす。SSEトランスポヌトで最も䞀般的なパラメヌタは以䞋のずおりです。

    ・host : バむンド先のホスト (デフォルト : "0.0.0.0")
    ・port : バむンド先のポヌト (デフォルト :  8000)
    ・log_level : ログレベル (デフォルト : "INFO")

    ・高床なトランスポヌト構成
    FastMCP の run() は、内郚的には、トランスポヌト固有の実行メ゜ッドに枡される任意のキヌワヌド匕数 (**transport_kwargs) を受け入れたす。

    # SSEトランスポヌトの堎合、kwargsはrun_sse_async()に枡される
    mcp.run(transport="sse", **transport_kwargs)
    
    # stdioトランスポヌトの堎合、kwargsはrun_stdio_async()に枡される
    mcp.run(transport="stdio", **transport_kwargs)

    将来的に远加されるトランスポヌト固有のオプションは、コヌドを倉曎するこずなく、同じむンタヌフェヌスから自動的に利甚できるようになりたす。

    ・FastMCP CLIの䜿甚
    FastMCP CLI は、サヌバを実行するための䟿利な方法を提䟛したす。

    # サヌバを実行 (デフォルトはstdioトランスポヌト)
    fastmcp run my_server.py:mcp
    
    # トランスポヌトを明瀺的に指定
    fastmcp run my_server.py:mcp --transport sse
    
    # ホストずポヌトでSSEトランスポヌトを構成
    fastmcp run my_server.py:mcp --transport sse --host 127.0.0.1 --port 8888
    
    # ログレベル付き
    fastmcp run my_server.py:mcp --transport sse --log-level DEBUG

    CLI はファむル内の FastMCP サヌバ オブゞェクトを動的に怜玢しお実行できたすが、if __name__ == "__main__": ブロックを含めるず、すべおのクラむアントずの互換性が確保されたす。

    5. コンポヌゞングサヌバ

    FastMCPは、import_server (静的コピヌ) ずmount (ラむブリンク) を䜿甚しお耇数のサヌバを統合する機胜をサポヌトしおいたす。これにより、倧芏暡なアプリケヌションをモゞュヌル型コンポヌネントにたずめたり、既存のサヌバを再利甚したりするこずが可胜になりたす。

    詳现、ベストプラクティス、および䟋に぀いおは、サヌバ構成ガむドを参照しおください。

    # 䟋: サブサヌバのむンポヌト
    from fastmcp import FastMCP
    import asyncio
    
    main = FastMCP(name="Main")
    sub = FastMCP(name="Sub")
    
    @sub.tool()
    def hello(): 
        return "hi"
    
    main.mount("sub", sub)

    6. プロキシサヌバ

    FastMCPは、FastMCP.from_clientを䜿甚するこずで、任意のMCPサヌバ (ロヌカルたたはリモヌト) のプロキシずしお動䜜し、トランスポヌトをブリッゞしたり、既存のサヌバにフロント゚ンドを远加したりできたす。䟋えば、リモヌトSSEサヌバをstdio経由でロヌカルに公開したり、その逆を行ったりできたす。

    詳しくはプロキシサヌバガむドを参照しおください。

    from fastmcp import FastMCP, Client
    
    backend = Client("http://example.com/mcp/sse")
    proxy = FastMCP.from_client(backend, name="ProxyServer")
    # 他のFastMCPサヌバず同様にプロキシを䜿甚

    7. サヌバの構成

    トランスポヌト蚭定 (SSEのhost、port) や重耇コンポヌネントの凊理方法ずいったサヌバの動䜜は、ServerSettingsで蚭定できたす。これらの蚭定は、FastMCPの初期化時に枡すか、環境倉数FASTMCP_SERVER_で始たるで蚭定するか、.envから読み蟌むこずができたす。

    from fastmcp import FastMCP
    
    # 初期化䞭に蚭定
    mcp = FastMCP(
        name="ConfiguredServer",
        port=8080, # ServerSettingsに盎接マップ
        on_duplicate_tools="error" # 重耇凊理を蚭定
    )
    
    # 蚭定はmcp.settingsからアクセスできる
    print(mcp.settings.port) # 出力: 8080
    print(mcp.settings.on_duplicate_tools) # 出力: "error"

    䞻芁な蚭定オプションは、次のずおりです。

    ・host : SSEトランスポヌトのホストアドレス (デフォルト : “0.0.0.0”)
    ・port : SSEトランスポヌトのポヌト番号 (デフォルト : 8000)
    ・log_level : ログレベル (デフォルト : "INFO")
    ・on_duplicate_tools : ツヌル登録の重耇の凊理方法
    ・on_duplicate_resources : リ゜ヌス登録の重耇の凊理方法
    ・on_duplicate_prompts : プロンプト登録の重耇の凊理方法

    これらはすべお、FastMCPむンスタンスの䜜成時にパラメヌタずしお盎接蚭定できたす。

    8. 認蚌

    FastMCP は、MCP プロトコルから OAuth 2.0 認蚌のサポヌトを継承し、サヌバが認蚌の背埌でツヌルずリ゜ヌスを保護できるようにしたす。

    8-1. OAuth 2.0 サポヌト

    mcp.server.auth モゞュヌルは、OAuthServerProvider プロトコルの実装を提䟛するこずで、サヌバが䜿甚できる OAuth 2.0 サヌバむンタヌフェヌスを実装したす。

    from fastmcp import FastMCP
    from mcp.server.auth.settings import (
        RevocationOptions,
        ClientRegistrationOptions,
        AuthSettings,
    )
    
    
    # 認蚌付きサヌバを䜜成
    mcp = FastMCP(
        name="SecureApp",
        auth_provider=MyOAuthServerProvider(),
        auth=AuthSettings(
            issuer_url="https://myapp.com",
            revocation_options=RevocationOptions(
                enabled=True,
            ),
            client_registration_options=ClientRegistrationOptions(
                enabled=True,
                valid_scopes=["myscope", "myotherscope"],
                default_scopes=["myscope"],
            ),
            required_scopes=["myscope"],
        ),
    )

    次回



     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ