MCPサーバーのPython実装:基本的な動作の確認 Link to heading
はじめに Link to heading
前回の記事で実装したMCPサーバーの基本的な動作を確認しました。この記事では、サーバーの起動から初期化リクエストの処理までの流れを詳しく解説します。
サーバーの起動 Link to heading
まず、以下のコマンドでサーバーを起動します:
1uvicorn src.main:app --reload
このコマンドの各部分の意味:
uvicorn
: ASGIサーバー実装src.main:app
:src/main.py
のapp
オブジェクトを指定--reload
: コード変更時に自動再読み込み(開発用)
起動すると以下のようなログが表示されます:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [43633] using StatReload
INFO: Started server process [43635]
INFO: Waiting for application startup.
INFO: Application startup complete.
初期化リクエストの送信 Link to heading
サーバーが起動したら、初期化リクエストを送信してみます:
1curl -X POST "http://127.0.0.1:8000/" -H "Content-Type: application/json" -d '{
2 "method": "initialize",
3 "params": {
4 "capabilities": {},
5 "clientInfo": {
6 "name": "Test Client",
7 "version": "1.0.0"
8 }
9 }
10}'
このリクエストの構造:
method
: “initialize”(初期化リクエストを示す)params
:capabilities
: クライアントの機能(今回は空)clientInfo
: クライアントの情報
サーバーの応答 Link to heading
サーバーは以下のような応答を返します:
1{
2 "protocolVersion": "2025-03-26",
3 "capabilities": {
4 "logging": {},
5 "completions": {},
6 "prompts": {
7 "listChanged": true
8 },
9 "resources": {
10 "subscribe": true,
11 "listChanged": true
12 },
13 "tools": {
14 "listChanged": true
15 }
16 },
17 "serverInfo": {
18 "name": "MCP Basic Server",
19 "version": "1.0.0"
20 },
21 "instructions": "This is a basic MCP server implementation for learning purposes."
22}
応答の各フィールドの意味:
protocolVersion
: MCPのプロトコルバージョンcapabilities
: サーバーが提供する機能logging
: ログ機能completions
: 補完機能prompts
: プロンプト管理機能resources
: リソース管理機能tools
: ツール管理機能
serverInfo
: サーバーの情報instructions
: クライアントへの説明
内部の処理の流れ Link to heading
リクエストの受信(
main.py
):1@app.post("/") 2async def handle_request(request: Request) -> dict: 3 data = await request.json() 4 method = data.get("method")
リクエストの検証と変換(
models.py
):1class InitializeRequest(BaseModel): 2 method: str = "initialize" 3 params: Dict[str, Any]
初期化処理(
server.py
):1async def handle_initialize(self, request: InitializeRequest) -> InitializeResult: 2 result = InitializeResult( 3 protocolVersion=self.protocol_version, 4 capabilities=self.capabilities, 5 serverInfo=self.server_info, 6 instructions="..." 7 )
設計のポイント Link to heading
非同期処理:
- FastAPIとUvicornによる効率的な非同期処理
async/await
を使用した非同期関数の実装
型安全性:
- Pydanticモデルによるリクエスト/レスポンスの検証
- 型ヒントによるコードの安全性確保
モジュール分割:
models.py
: データモデルの定義server.py
: ビジネスロジックmain.py
: HTTPインターフェース
次のステップ Link to heading
現在の実装は基本的な機能のみですが、以下の機能を追加する予定です:
エラーハンドリング
- 不正なリクエストの処理
- エラーレスポンスの標準化
ログ機能の強化
- 構造化ログの導入
- デバッグ情報の充実
テストの追加
- ユニットテスト
- 統合テスト
注記 本記事はMCPサーバーの基本的な動作確認にフォーカスしていますが、現状の実装では logger.py(ログ機能)や errors.py(エラーハンドリング)などの拡張ファイルも既に存在します。 これらの詳細については、今後の記事で順次解説していきます。
まとめ Link to heading
MCPサーバーの基本的な動作を確認し、以下の点が確認できました:
- FastAPIとUvicornによる効率的なサーバー実装
- Pydanticを使用した型安全なデータ処理
- 非同期処理による効率的なリクエスト処理
次の記事では、エラーハンドリングの実装について説明します。