第8回 自分のMCPを作る
「使う側」から「作る側」へ
Lesson 02〜07では、Notion・Slack・PubMed・Calendarという、誰かが作ったMCPを使わせてもらってきました。 ここから先は自分が作る番です。自分の業務に特化した機能、公式MCPにない機能を、Claudeに「道具」として生やします。
なぜ自分で作るのか
なぜ自分で作るのか
公式MCPがカバーしていない領域がある
厚労省の薬剤情報DB・CiNiiの日本語論文・学会の演題検索システムには、まだ公式MCPがない
自分のツールをClaudeと統合できる
Level 201で作ったPythonスクリプトをMCPで包むと「ターミナルで叩く」が「話しかける」に変わる
同業者に配れる
GitHubに公開すれば同じ専門領域の医師・研究者が claude mcp add で使える。1人が作れば何百人の手間が省ける
Level 201: python pubmed_search.py "小児喘息" ← ターミナルで叩く
↓ MCPで包む
Level 301: 「PubMedで小児喘息の論文を検索して」 ← 話しかけるだけ
事前準備
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()
いきなりClaude Codeに繋がず、まずFastMCP・@mcp.tool()・mcp.run()があることを確認し、構文チェックが通るところまで見ます。
これを my_mcp.py として保存します。
Claude Codeに繋ぐ
claude mcp add my-first --command "uv run my_mcp.py"
Claude Codeを再起動して:
「Hello from my MCP, World!」が返ってきたら成功です。あなたは「MCPを作る側」になりました。
ステップ2:既存ツールをMCPで包む
Hello Worldが動いたら、実用的なツールをMCPにします。
例:簡易計算ツールのMCP化
Level 101で作った「解熱薬の用量計算ツール」をMCPにします。Claude Codeに:
できあがったMCPを繋ぐと:
Claudeがツールを呼び出し、計算結果を返します。
ステップ3:外部APIを叩くMCPを作る
実際に外部からデータを取得するMCPです。
どのAPIを使うか
日本のPMDA(医薬品医療機器総合機構)は、誰でも自由に叩ける公開APIを、いまのところ出していません。だから「PMDAのAPIで」とお願いしても、Claudeは動くものを作れません。
仕組みを学ぶには、実際に鍵なしで動くAPIを題材にします。ここでは、米国FDAが公開している openFDA を使います。無料で、APIキーもいりません。
日本語の薬剤データを引きたいときは、KEGG(https://rest.kegg.jp)が同じく鍵なしで使えます。
openFDAは米国の添付文書です。日本の臨床判断にそのまま持ち込むものではありません。今日はあくまで、外部APIをMCPで包む手順を体で覚えるための題材として使います。
例:薬剤情報検索MCP
Claude Codeに:
コードが生成されたら、動作確認します。
うまくいけば、適応と警告の要点が返ってきます。 0件やエラーが返ったら、その文面をそのままClaude Codeに貼って直してもらいます(鍵は扱わないので、貼って困る情報はありません)。
MCPを設計するときの考え方
MCPを設計するときの考え方
「何を話しかけたいか」から始める
先にユーザーストーリーを書く。例:「アモキシシリンの子どもの用量」と話しかけたい
入力と出力を決める
話しかける内容(入力)と、欲しい返答(出力)を具体化する
Claude Codeにコードを書かせる
設計が決まったら詳細な仕様を渡す。コードを自分で書く必要はない
| 入力 | 出力 |
|---|---|
| 薬剤名(文字列) | 適応・用量・警告の要点 |
| 体重(数値) + 薬剤名(文字列) | 1回量(mg)の目安 |
| 疾患名 + 年号範囲 | 論文一覧 |
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 の終わりに
Lesson 01「単体は性能の1割」から始まり、02でMCPの概念を、03でPubMed検索を、04でNotion・Slack・カレンダーを、05でDispatchを、06で5経路の全体像を、07でセキュリティの基準を扱いました。そして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へと続く道です。