「従来の手法」でMCPサーバーを構築する際の苦労
先月、深夜2時に急ぎのタスクが入りました。サーバーダウン時に自動的に原因を特定するため、Claude Desktopをログシステムに接続する必要があったのです。私はModel Context Protocol (MCP) の標準SDKを使って必死に作業しましたが、結果はどうだったでしょうか? JSONスキーマの定義、接続管理、細かなエラーハンドリングといったボイラープレートコードを書くだけで1時間以上を費やしてしまいました。
その時の感覚は、釘を一本打ちたいだけなのに、ハンマーそのものを鋳造するところから始めなければならないようなものでした。公式のSDKは非常に強力ですが、迅速なデプロイが必要な場合には低レイヤー(low-level)すぎます。それが、私がFastMCPに切り替えた理由です。このフレームワークは、FastAPIがWeb APIの開発を劇的に変えたのと同じように、MCPサーバーの作成を非常に軽量にしてくれます。
比較:標準SDK vs. FastMCP
コードを書き始める前に、その違いを見てみましょう。なぜ現在の実務プロジェクトにおいてFastMCPが第一の選択肢となるのかが理解できるはずです。
1. MCP Python SDK(従来の手法)
この方法では、すべてを手動で定義する必要があります。ツールを追加したい場合、関数を記述し、それをリストに登録し、さらにJSONスキーマを用いて入力と出力を詳細に記述しなければなりません。スキーマの中でカンマが一つ抜けているだけで、AIはそのツールが何のためのものか理解できず、立ち往生してしまいます。
2. FastMCP(新しい手法)
FastMCPは、FastAPIと同様にPythonのデコレータを使用します。純粋なPython関数を記述し、デコレータを追加するだけで完了です。フレームワークがJSONスキーマの生成、データのバリデーション、そしてMCPクライアントへの登録を自動的に処理してくれます。これにより、冗長なコードを最大80%削減できます。
| 比較項目 | 標準SDK | FastMCP |
|---|---|---|
| 導入時間 | 数時間 | 数分 |
| ツールの定義 | 手動のJSONスキーマ | デコレータによる自動化 |
| 複雑さ | 高く、ミスが起きやすい | 低く、メンテナンスが容易 |
| バリデーション | ロジックの自作が必要 | Pythonの型ヒントに基づく |
なぜFastMCPを使うべきなのか?
私が感じた最大の利点は、開発者体験 (DX) です。ビジネスロジックに集中している時、プロトコルの構造に煩わされたくはありません。FastMCPは、「この関数をAIにどう説明するか?」ではなく、「この関数はAIのために何のデータを取得するのか?」という本質的な問いに集中させてくれます。
とはいえ、抽象化されている分、内部の詳細が隠蔽されているという小さなデメリットもあります。トランスポート層に極めて深く介入する必要がある場合、FastMCPでは少し窮屈に感じるかもしれません。しかし、一般的なニーズの95%においては、これが最適な選択肢です。
実践:MCPサーバーの構築手順
ここでは、AIがログファイルを読み取り、リアルタイムでシステムリソースをチェックできるようにするサーバーを構築します。
ステップ1:環境構築
ライブラリの競合を避けるために仮想環境を作成します。通常のpipよりも10倍高速なuvを使用してインストールすることをお勧めします。
pip install fastmcp psutil
ステップ2:MCPサーバーのソースコード作成
server.pyを作成します。驚くほどすっきりしていることがわかるでしょう:
from fastmcp import FastMCP
import psutil
import os
# 識別名でサーバーを初期化
mcp = FastMCP("SystemMonitor")
# AIがディスク容量を確認するためのツール
@mcp.tool()
def get_disk_usage(path: str = "/") -> str:
"""特定のパスのディスク容量を確認します。"""
usage = psutil.disk_usage(path)
free_gb = usage.free // (2**30)
return f"空き容量: {free_gb}GB(合計 {usage.total // (2**30)}GB 中)"
# AIがシステム情報を読み取るためのリソース(読み取り専用)
@mcp.resource("config://system_info")
def get_system_info() -> str:
"""CPUとOSの情報を提供します。"""
return f"OS: {os.name}, CPU: {os.cpu_count()} コア"
if __name__ == "__main__":
mcp.run()
コードの解説:
- @mcp.tool(): Python関数をAIが呼び出し可能なツールに変換します。FastMCPは型ヒント(例:
path: str)を自動的に解析し、スキーマを生成します。 - Docstring: これはAIのための「説明書」です。AIはこれを見て、いつツールを使うべきかを判断します。
- @mcp.resource(): AIが参照するための静的データやシステム状態を提供します。
ステップ3:Claude Desktopへの接続
テストを行うために、claude_desktop_config.jsonファイルに設定を追加します:
{
"mcpServers": {
"monitor-server": {
"command": "python",
"args": ["/サーバーへのパス/server.py"]
}
}
}
Claudeを再起動すると、稲妻のアイコンが表示されます。これで、「PCのディスクの空き容量はどれくらい?」と質問すれば、AIが作成した Python関数を自動的に呼び出してくれます。
実戦で得た「血肉となる」教訓
何度もデバッグを繰り返した結果、サーバーを安定して稼働させるための3つの重要なポイントをまとめました:
- Docstringにこだわる: 適当に書かないでください。「パーティション間のディスク容量を比較する必要がある時にこのツールを使用する」といった具合に詳細に記述しましょう。これにより、AIの賢さが格段に向上します。
- 丁寧にTry-Exceptで囲む: サーバーをクラッシュさせないようにしましょう。エラーは文字列として返してください。例えば「エラー:パス /data が見つかりません」と返せば、AIは停止することなく、それを読み取って別の解決策を提案してくれます。
- 権限の管理: FastMCPは現在のユーザー権限で動作します。入力値のバリデーションを徹底せずに、ファイルを削除するようなツール(
os.removeなど)を記述することは絶対に避けてください。
FastMCPは、バラバラなPythonスクリプトを強力なAIエージェントシステムへと変える最短ルートです。技術的な障壁を取り除き、最も重要なデータとビジネスロジックに集中させてくれます。
