この回のゴール
- 公式
mcpPython SDK で MCP サーバーを書けるようになる - FastMCP デコレータでツール/リソース/プロンプトを登録できる
- サーバーを subprocess で実際に起動 して JSON-RPC 対話する
- 次回(Claude Desktop 連携)のための 動くサーバー を用意する
1. 使うライブラリ
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf|sudo rm'; then echo 'Blocked: dangerous command' >&2; exit 2; fi"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "ruff format $CLAUDE_FILE_PATHS 2>&1 || true"
}
]
}
]
}
}
公式 SDK のクラス: - Claude が「使うべき」と判断したら呼ばれる = lazy。 だが業務には — サーバーの簡易定義(推奨) - 絶対に毎回守らせたい ルールがある: — stdio 経由でサーバーに繋ぐクライアント - Hooks = Claude のセッション中、特定のイベントで — クライアントの会話管理
2. 最小 MCP サーバーの全コード
server.py にこれだけ書けばサーバー 1 つが完成します:
claude
> ホームディレクトリ全部消して
ポイント
FastMCP("名前")でサーバーのインスタンスを作成@mcp.tool()デコレータで関数をツールとして 自動登録- 関数の docstring が
descriptionに、型ヒント がinput_schemaになる mcp.run()で stdio transport で起動(デフォルト)
これで Claude API で書いていた TOOL_DEFINITION = {...} が 不要 になります。
3. リソースとプロンプトも登録できる
> README.md を整形して(行末スペース削除など)
- Resource: ファイル/DB 等の 参照データ (URI でアドレス可能)
- Prompt: 再利用可能なプロンプトテンプレ
4. サーバーの起動方法
方法 A: 直接コマンドライン
# stdio で手動操作(テスト用)
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}' | python server.py
方法 B: mcp CLI
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "echo \"[$(date)] session $CLAUDE_SESSION_ID ended\" >> ~/.claude/sessions.log"
}
]
}
]
}
}
方法 C: Claude Desktop から自動起動
次回 (s4) で扱う。claude_desktop_config.json にパスを書くと Claude が subprocess として自動起動する。
5. 動作確認の 2 通り
(a) mcp-inspector (CLI/GUI)
wzxhzdk:5
ブラウザで ツール一覧を確認・実行 できる公式 GUI。開発時の定番。
(b) 自作クライアント
Python のクライアント SDK でサーバーに繋ぎ、JSON-RPC 往復を可視化 できます:
wzxhzdk:6
6. 第 6 章のツールを MCP 化する
第 6 章の calculator や search_handbook を MCP サーバーに移植すれば、同じロジック が:
- Claude API から使える(今まで通り)
- Claude Desktop から使える(次回)
- 他の MCP 対応 LLM (GPT-4 等) から使える
- 他の開発者が自分のエージェントから使える
一度書けば、あらゆる所で使える。これが MCP の威力。
7. デバッグのコツ
ログ確認
wzxhzdk:7
手動テスト
# stdio で手動操作(テスト用)
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}' | python server.py
よくあるハマリポイント
| 症状 | 原因 | 対策 |
|---|---|---|
| サーバー起動しない | 依存関係不足 | pip install mcp |
| ツールが見えない | @mcp.tool() 忘れ |
デコレータ必須 |
| 引数エラー | 型ヒント不足 | 明示的な型を付ける |
| Claude Desktop で読まれない | 設定ミス | config.json のパス確認 |
まとめ
- 公式
mcpPython SDK + FastMCP で 30 行 の MCP サーバーが作れる @mcp.tool()のデコレータ + docstring + 型ヒントで自動的にツール登録される- 3 プリミティブ: Tools / Resources / Prompts いずれもデコレータで宣言
- 検証は mcp-inspector(公式 GUI) か 自作クライアント で
この回の限界(次への動機)
サーバーは動いた。次は Claude Desktop に登録して、Claude の純正 UI からこのツールを呼ばせる。 👉 次回「Claude Desktop と繋ぐ」で、本シリーズの集大成として「第 5 章 RAG を MCP 化して Claude が自動検索する」を実現します。