Maru@maru

Dev Hub

Translated from KoreanView original

Fastifyで構築するMCPサーバー — APIスキーマ自動化からRedisスケールアウトまで

AIエージェントと外部ツールを接続するモデルコンテキストプロトコル(MCP)が急速に普及する中、ローカルターミナルベースのstdio環境や単一のSSE接続を超えた、本番環境に適したクラウドバックエンドアーキテクチャが必要になっています。圧倒的な処理性能を誇るFastifyと最新のMCP開発エコシステムを組み合わせることで、大規模トラフィック下でも途切れることなく水平拡張可能な、高性能エージェントインフラを構築できます。APIスキーマによるツール定義の自動登録からRedisを活用したセッションのスケールアウトまで、プロダクション環境への導入に即した堅牢なMCPサーバー構築ガイドを紹介します。

Streamable HTTPと @modelcontextprotocol/fastify v2.0

最新のモデルコンテキストプロトコル仕様が適用されたSDK v2.0からは、従来の複雑で接続維持の負担が大きかったSSE方式に代わり、Streamable HTTPが標準トランスポート層として完全に定着しました。この新しい標準は、クライアントとの双方向ストリームのライフサイクルをHTTP POSTリクエストベースのレスポンスストリーミング形式で制御するため、ファイアウォールの通過やロードバランシングといった分散インフラの運用課題をスムーズに解決します。

Node.js環境において、公式SDKの@modelcontextprotocol/fastifyアダプターと@modelcontextprotocol/nodeパッケージを組み合わせれば、超高速フレームワークであるFastify上で、本番グレードのStreamable HTTPエンドポイントを容易に立ち上げることが可能です。特にローカルホスト環境で発生しやすいDNSリバインディング攻撃を根底から防ぐため、hostHeaderValidationミドルウェアを適用することが必須となります。

以下は、Fastify v2.0 SDKをベースに、安全なStreamable HTTPサーバーを構築するための標準的なコードパターンです。

typescript

このパターンは、クライアントリクエストが届くたびに使い捨てのトランスポートを接続してトラフィックを処理する、ステートレスなプロキシアーキテクチャにおいて極めて有利です。Node.js標準のIncomingMessageとServerResponseストリームを直接連携させるため、軽量かつ柔軟に、エージェントの多様なJSON-RPCリクエストを安定的に処理できます。

APIスキーマに基づいたMCPツールの自動登録

API開発とAIエージェント向けツール定義の管理を分けず、一つに統合することで開発生産性を大幅に向上できます。@mcp-it/fastifyプラグインは、Fastify独自のルートコンパイルライフサイクルを活用して、このプロセスを自動化します。サーバー起動時にonRouteフックを呼び出してアプリケーションに登録されたすべてのAPIエンドポイントを走査し、各ルートのschemaオブジェクトから、ツール識別子として使用されるユニークな名称と詳細説明を動的に抽出します。

その後、プラグインはリクエスト引数として宣言されたJSONスキーマ定義を、エージェントが理解可能なMCPツール仕様にリアルタイムで変換します。エージェントがMCPクライアント経由で特定のツールを実行すると、プラグインは渡されたパラメータペイロードを仮想リクエストオブジェクトにマッピングして内部ルーターに送ります。これにより、複雑なAPI呼び出しの中継ロジックを新たに実装することなく、既存のコントローラーロジックをそのまま活用できるようになります。

このスキーマの自動抽出方式は、TypeScript環境でTypeBoxバリデーションライブラリと連携させる際に強力な相乗効果を発揮します。@fastify/type-provider-typeboxを通じて宣言したTypeBoxスキーマは、コンパイル時のTypeScript型チェックと実行時のAPIバリデーションの両方の役割を同時に果たします。この設計データが修正なしでそのままMCPツール仕様に変換されるため、コードを一行修正するだけで、APIコントローラー、検証レイヤー、そしてAIエージェントのツール仕様が即座に同期されます。

以下は、TypeBoxを使用してAPIエンドポイントを構成しつつ、同時にMCPツールとして自動公開するコード例です。

typescript

このように構成すれば、AIエージェントがMCP経由で該当ルートを呼び出した際、Fastify内部のコントローラーロジックが仮想リクエストインターフェースを通じて安全に実行されます。

Redisを利用したMCPセッションの水平拡張

一般的なモデルコンテキストプロトコルサーバーはセッション状態や接続情報をメモリに保持するため、トラフィック増大に合わせてインスタンスを水平方向に拡張すると、セッション接続が切断されるという構造的な制約があります。Platformaticチームが開発した@platformatic/mcpプラグインは、セッション管理とメッセージ配送システムをRedisベースの分散アーキテクチャに透過的に切り替えることで、この問題を解決します。

このプラグインはredisオプションを設定するだけで、内部の動作プロセスを完全に書き換えます。従来のインメモリセッションストレージは、複数ノードで共有されるRedisSessionStoreへと自動的に切り替わります。同時に、分散Pub/Subライブラリであるmqemitter-redisをバックプレーンとして採用することで、セッション固有のチャネル(mcp/session/{sessionId}/message)を介して送られるすべての制御イベントを、クラスター内の全サブノードへリアルタイムにブロードキャストします。

typescript

このアーキテクチャを導入すれば、クライアントがロードバランサーによって異なるサーバーインスタンスへランダムに振り分けられても、途切れることのないエージェントセッションを維持できます。一時的なネットワーク障害でセッションが切れた場合もLast-Event-IDヘッダーを使用し、Redisに保管された履歴から接続ストリームをスムーズに再開します。特に、非同期のバックグラウンドタスクを特定のノードで処理している最中であっても、クライアントが別の分散ノードから進捗状況をポーリングして安全に結果を確認できるため、真の意味でのエンタープライズ級の高可用性エージェントレイヤーを実現可能です。

プロダクション導入のためのアーキテクチャチェックリスト

Fastifyと最新のモデルコンテキストプロトコルエコシステムを組み合わせて高可用性エージェントバックエンドを構築する際は、3つの重要な設計要素を確認する必要があります。第一に、公式SDK v2.0で提供されるホストヘッダー検証機能を有効化し、DNSリバインディングのようなセキュリティ脅威からエージェント実行環境を保護してください。第二に、同時接続が集中する実務環境では、ツール実行速度がバックエンド全体のボトルネックにならないよう、必ず実行時間の制限を明確に設定すること。最後に、インスタンスを水平拡張する際は、セッションの消失を防ぐためにRedisベースのセッションストレージと分散メッセージングアーキテクチャを導入することで、クラウド環境に最適化された高性能なエージェントインフラを完成させることができます。

参考リンク

Loading comments…