Vibe Coding Level 301 連携編
第8回 自分のMCPを作る
このレッスンで終わる頃には
- MCPサーバーの最小構成(Hello World)を自分で動かせる
- 既存のPythonスクリプトやツールをMCPで包む発想と手順がわかる
- 公式MCPにない医療領域固有の機能を自作MCPとして提供できる
「使う側」から「作る側」へ
Lesson 02〜07では、既存のMCPを繋いで使ってきました。
Notion・Slack・PubMed・Calendar。
これらは、誰かが作ったMCPを使わせてもらっている状態です。
ここから先は自分が作る番です。
自分の業務に特化した機能、公式MCPにない機能、自分だけが必要な機能を、Claudeに「道具」として生やします。
なぜ自分で作るのか
理由は3つあります。
1. 公式MCPがカバーしていない領域がある
PubMedにはMCPがありますが、たとえば「厚労省の薬剤情報DB」「CiNiiの日本語論文」「学会の演題検索システム」には、まだ公式MCPがありません。
自分で作れば、これらを「Claudeに話しかけるだけ」で使えるようになります。
2. 自分のツールをClaudeと統合できる
Level 201 で作ったPythonスクリプトや、自分が使ってきたコマンドラインツール。 MCPで包むと、「ターミナルで叩く」から「Claudeに話しかける」に変わります。
Level 201: python pubmed_search.py "小児喘息" ← ターミナルで叩く
↓ MCPで包む
Level 301: 「PubMedで小児喘息の論文を検索して」 ← 話しかけるだけ
3. 同業者に配れる
GitHubに公開すれば、同じ専門領域の医師・研究者が claude mcp add で使えます。
1人が作れば、何百人の手間が省けます。
事前準備
Pythonと uv がインストールされていることを確認します。
python --version
# Python 3.10以上
uv --version
# バージョンが出ればOK
uv がなければ:
curl -LsSf https://astral.sh/uv/install.sh | sh
ステップ1:Hello World MCPを作る
まず「動く最小単位」を作ります。
Claude Codeに以下を投げてください:
Pythonで、最小のMCPサーバーを作ってください。
FastMCPを使って、ツールは1つだけ:
helloというツールを呼ぶと「Hello from my MCP!」を返す、それだけ。
uvで動かせる単一ファイルにしてください。
Claudeが生成するコードはこういう形になります:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-first-mcp")
@mcp.tool()
def hello(name: str = "World") -> str:
"""挨拶を返す"""
return f"Hello from my MCP, {name}!"
if __name__ == "__main__":
mcp.run()
これを my_mcp.py として保存します。
Claude Codeに繋ぐ
claude mcp add my-first --command "uv run my_mcp.py"
Claude Codeを再起動して:
helloツールを使って
「Hello from my MCP, World!」が返ってきたら成功です。 あなたは「MCPを作る側」になりました。
ステップ2:既存ツールをMCPで包む
Hello Worldが動いたら、実用的なツールをMCPにします。
例:簡易計算ツールのMCP化
Level 101で作った「解熱薬の用量計算ツール」をMCPにします。
Claude Codeに:
以下の計算ロジックをMCPサーバーとして包んでください。
ツール名:calc_antipyretic_dose
入力:weight(体重、kg、数値)
出力:アセトアミノフェンの1回量の目安(mg)
計算式:体重 × 10〜15 mg/kg、最大量500mg
FastMCPで、uvで動かせる単一ファイルで。
できあがったMCPを繋ぐと:
体重12.5kgの子の解熱薬の量を計算して
Claudeがツールを呼び出し、計算結果を返します。
ステップ3:外部APIを叩くMCPを作る
実際に外部からデータを取得するMCPです。
例:薬剤情報検索MCP
日本では、医薬品医療機器情報提供ホームページ(PMDA)が薬剤情報を公開しています。 このAPIを叩くMCPを作ります。
Claude Codeに:
Pythonで、PMDAのAPIを使って薬剤情報を検索するMCPサーバーを作ってください。
ツール名:search_drug_info
入力:drug_name(薬剤名、文字列)
出力:薬剤の基本情報(適応・用法・警告の要点)
APIエンドポイントのURLは [PMDAのAPI仕様] を参照して。
FastMCPで、uvで動かせる単一ファイルで。
エラー処理も入れて。
コードが生成されたら、動作確認します:
PMDAで「アセトアミノフェン」の情報を検索して
MCPを設計するときの考え方
自作MCPを作るとき、以下の順序で考えます。
1. 「何を話しかけたいか」から始める
先にユーザーストーリーを書きます。
「小児の薬剤情報を確認するとき、『アモキシシリンの子どもの用量』と話しかけたい」
このひと言が、MCPのツール設計の出発点です。
2. 入力と出力を決める
話しかける内容(入力)と、欲しい返答(出力)を具体化します。
| 入力 | 出力 |
|---|---|
| 薬剤名(文字列) | 適応・用量・警告の要点 |
| 体重(数値) + 薬剤名(文字列) | 1回量(mg)の目安 |
| 疾患名 + 年号範囲 | 論文一覧 |
3. Claude Codeにコードを書かせる
設計が決まったら、Claude Codeに詳細な仕様を渡してコードを生成させます。 コードを自分で書く必要はありません。
GitHubで公開する
完成したMCPをGitHubに上げると、他の人も使えます。
# 新しいリポジトリを作ってプッシュ
gh repo create my-medical-mcp --public --source=. --push
READMEに最低3行書きます:
# my-medical-mcp
小児科外来向けの薬剤情報・用量計算MCPサーバー
## 使い方
1. git clone
2. claude mcp add medical --command "uv run medical_mcp.py"
3. 話しかけるだけ:「アモキシシリンの子どもの用量は?」
公開したらURLをメモしておきます。 同僚に「このコマンドを実行するだけで使えるよ」と共有できます。
Level 301 の終わりに
8つのレッスンで、こんな変化が起きました。
Lesson 01で「単体は性能の1割」という話から始まりました。 Lesson 02でMCPの概念を掴みました。 Lesson 03でPubMedを繋ぎ、論文検索が話しかけるだけになりました。 Lesson 04でNotionとSlackとカレンダーを繋ぎ、情報の流れが変わりました。 Lesson 05でDispatchを使い、外来の合間でも仕事を投げられるようになりました。 Lesson 06で5経路の全体像を把握しました。 Lesson 07でセキュリティの基準を整理しました。 Lesson 08で、使う側から作る側に変わりました。
単体のClaudeから、複数ツールと連携するClaudeへ。
この変化は、「AIに聞く」から「AIが動く」への転換です。
次のLevel 401では、さらに複雑なシステム設計と、複数エージェントを協調させる仕組みを扱います。
最終演習:自分専用MCPを1つ作る
このコースの締めくくりとして、以下を達成してください。
テーマ:自分の業務で「毎回手でやってること」を1つMCPにする
- 何をMCPにするかを1行で書く(例:「解熱薬の用量計算」「外来後の気づきメモ保存」)
- Claude Codeに仕様を伝えてコードを生成させる
- 動かして確認する
- GitHubに上げる(オプション)
小さくていいです。 「話しかけるだけで動く」自分専用の道具が1つできれば、それがLevel 301の卒業基準です。
Level 301 を終えて
「使う側」から「作る側」への移行は、Vibe Codingの本来の姿の一つです。
既存のツールを繋ぐMCPから、自分の業務に最適化したMCPへ。
ここからは、作って・使って・改善するサイクルが続きます。 そのサイクルを回す習慣が、Level 401・501へと続く道です。