なぜこれを書くか
現役のAIエンジニアで
現在は教育関係の仕事も実施している遠藤太一です。
本シリーズは、実プロダクト を題材に、自分が次に学ぶべき技術を 1 つずつ消化していく成長過程の記録です。
Part 1 は MCP (Model Context Protocol) です。
MCP とは何か
MCP は Anthropic が 2024 年 11 月に公開した、LLM アプリと外部システムを繋ぐオープン標準 です。USB-C 端子に例えられることが多く、「どんな LLM クライアント (Claude Desktop / Cursor / Cline / Continue 等) からでも、同じ仕様で外部データ・ツールを呼べる」のが本質です。
3 つのプリミティブ
| 種類 | 役割 | 例 |
|---|---|---|
| Resources | 読み取り専用のデータ |
lesson://2/section/4、exam-question://kokushi/2024_38_AM_62
|
| Tools | 副作用ありの関数呼び出し |
search_lessons(query)、generate_quiz(topic, count)
|
| Prompts | パラメータ付きテンプレ | quiz_me_on(lesson_no=3, level="basic") |
プロトコル本体
- Transport: stdio (ローカル) / SSE (リモート) で JSON-RPC 2.0 を流す
-
SDK:
@modelcontextprotocol/sdk(TypeScript) /mcp(Python) /mcp-rust-sdk(Rust) -
クライアント設定: Claude Desktop なら
~/Library/Application Support/Claude/claude_desktop_config.jsonにコマンドを書くだけ
なぜ今 MCP を学ぶのか
2025 年後半以降に「生成 AI / LLM / RAG / MCP」を並べて記載する企業が急増しています。生成 AI 系職種の応募者は飽和している一方、MCP を実プロダクトで動かしたことがある人は今でも希少 です。「これから流行る前から触ってる人」のポジションを取りに行ける数少ない技術です。
そして、医療現場こそ MCP の真価が活きる領域です。電子カルテ / 検査機器 / 院内 DB を 個別の API ラッパー無し に AI クライアントに繋げるのは、これまでは現実的じゃありませんでした。MCP なら 1 つの標準で行ける。
自分のプロダクトでどう使うか
私が運用している教材プラットフォーム (Next.js + Supabase + Gemini API) には:
- 全 10 回分のレッスン本文 (各回 8-12 セクション)
- ExamQuestion テーブル ( G検定 / 生成AIパスポート 過去問)
- 掲示板 (Phase B で pgvector ベース RAG 化済み)
これを MCP サーバーとして公開すると、Claude Desktop からこの教材コンテンツを直接参照しながら質問 できるようになります。例えば:
「第 3 回で扱った SaMD と厚労省 Q-26 の関係を、第 7 回の著作権の話と繋げて、資格試験で出そうな形式で問題作って」
これを Claude Desktop で打つと、MCP 経由で:
-
lesson://3/section/4(SaMD),lesson://3/section/2(厚労省 Q-26),lesson://7/section/4(著作権) を Resources で取得 -
generate_quiz_in_me2_styleTool を呼び出し - ExamQuestion DB から類似問題を検索して参考に
— という連携が、API 個別実装なしに動きます。
最小 MCP サーバーのコード
TypeScript SDK での骨格はこんな感じ:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { ListResourcesRequestSchema, ReadResourceRequestSchema } from "@modelcontextprotocol/sdk/types.js";
const server = new Server({ name: "lessons-mcp", version: "0.1.0" }, {
capabilities: { resources: {}, tools: {} }
});
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
resources: LESSONS.flatMap(l => l.sections.map((s, i) => ({
uri: `lesson://${l.no}/section/${i}`,
name: `第${l.no}回 §${i+1} ${s.title}`,
mimeType: "text/markdown",
}))),
}));
server.setRequestHandler(ReadResourceRequestSchema, async (req) => {
const match = req.params.uri.match(/^lesson:\/\/(\d+)\/section\/(\d+)$/);
if (!match) throw new Error("Invalid URI");
const lesson = LESSONS.find(l => l.no === Number(match[1]));
const section = lesson?.sections[Number(match[2])];
return { contents: [{ uri: req.params.uri, mimeType: "text/markdown", text: section?.content ?? "" }] };
});
await server.connect(new StdioServerTransport());
Claude Desktop 側の設定:
{
"mcpServers": {
"lessons": {
"command": "node",
"args": ["/Users/tai/AI/Portfolio.lessons/mcp-server/dist/index.js"]
}
}
}
これで Claude Desktop 起動時に MCP サーバーが立ち上がり、Resources がドロップダウンに出現します。
次のステップ
このシリーズの次回 (Part 2) では実装記録を書きます:
- ExamQuestion を Tool として公開し、Claude Desktop から「○○について類題を 5 問」と打つだけで国試問題が手に入る仕組み
- Phase B で組んだ pgvector RAG を MCP Tool 経由でも叩けるようにする
- 認証 (現状の MCP は認証が弱いので、ローカル運用前提)
- 既存ユーザー (40 名の臨床工学技士学科 1 年生) への影響評価
学んだこと (現時点で)
- MCP は 過剰に複雑じゃない。JSON-RPC + 3 プリミティブだけ
- ただし 「何を Resources にして何を Tools にするか」の設計判断が肝。ここを間違えると LLM が使いこなせない
- 医療系では、Resources は読み取り (患者情報の閲覧)、Tools は副作用 (オーダーや投薬指示) で分ける設計が安全
- 病院 IT の閉域網での運用なら ZDR 契約 LLM + ローカル MCP サーバー の組み合わせが本命
実装記録は次回。
タグ: MCP 生成AI LLM Anthropic Claude 医療AI TypeScript RAG