メインコンテンツへスキップ
レッスン 8 / 8|11分で読めます

自分のMCPを作る

使う側から作る側へ。公式MCPにない自分専用の機能をMCPサーバーとして包む。Pythonで最小構成から始めて、業務固有のツールをClaudeに生やす。

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にする

  1. 何をMCPにするかを1行で書く(例:「解熱薬の用量計算」「外来後の気づきメモ保存」)
  2. Claude Codeに仕様を伝えてコードを生成させる
  3. 動かして確認する
  4. GitHubに上げる(オプション)

小さくていいです。 「話しかけるだけで動く」自分専用の道具が1つできれば、それがLevel 301の卒業基準です。


Level 301 を終えて

「使う側」から「作る側」への移行は、Vibe Codingの本来の姿の一つです。

既存のツールを繋ぐMCPから、自分の業務に最適化したMCPへ。

ここからは、作って・使って・改善するサイクルが続きます。 そのサイクルを回す習慣が、Level 401・501へと続く道です。