実装

MCP サーバー初実装 — チャット窓の中で自分のコードが回る

著者: makemind · 2026年7月2日

チャット窓の中で自分のコードが実行される

Claude Desktop のチャットに「いま話したことをノートに保存して」と書く。モデルは答えをでっち上げる代わりに noteadd という道具を呼び、しばらくして「保存した」という結果が返答に引用される。次の会話で「私のノート何がある?」と聞けば notelist が回り、さっき保存したメモがそのまま出てくる。

その noteaddnotelist を実行したのは、自分のノートPCで回る数十行のサーバーだ。プラグインストアに上げたのでも、どこかに配備したのでもない。ローカルのファイルをひとつ dart run で立ち上げ、Claude Desktop の設定にパスを一行登録しただけだ。

この記事はそのサーバーを最初から作る。最後まで行けば、上のキャプチャがあなたの画面で再現される。


なぜサーバーなのか — デモではなくアダプタ

「LLM で何かをする」というと普通はプロンプトを思い浮かべる。しかしモデルが 自分のデータ を読む、あるいは 自分の機能 を実行しなければならない瞬間、プロンプトだけでは届かない。そのたびに我々は、クライアントごとにばらばらな連携コードを新しく貼ってきた。

MCP(Model Context Protocol)はその接続を規約ひとつに統一する。サーバーは自分の持つ機能を 名前の付いた道具 として差し出し、モデルはその道具を標準の方式で呼ぶ。一度作ったサーバーは Claude Desktop でも他の MCP クライアントでも同じ規約で繋がる。

だからこの記事が作るサーバーの正体は「温度を教えるデモ」ではなく、自分の機能・データを LLM に標準で繋ぐ一行のアダプタだ。例として選んだ機能は 永続ノート帳 である。会話が終わっても残るメモを四つの道具で扱う。

道具やること
note_addノートを保存する(会話が終わっても残る)。
note_list保存したノートを新しい順に見せる(タグでの絞り込み可)。
note_search本文に特定の文字列を含むノートを探す(大小文字は無視)。
note_deleteid でノートを消す。

モデルは会話の文脈に応じて、この四つのどれを呼ぶかを自分で選ぶ。我々がやるのは四つの 意味 を定義することだけだ。


このサーバーが座る場所

作るものを先に全体像の中に置いておくと、いま書いているコードがどこまで責任を負うのかがはっきりする。

[ LLM ]
   │
[ MCP クライアント ]   ← Claude Desktop(そして次の記事の mcp_client)
   │  JSON-RPC over stdio
   ▼
[ MCP サーバー ]  ← この記事が作るもの
   │            · サーバー起動(stdio)
   │            · 道具 4 つの登録(名前・入力スキーマ・ハンドラ)
   ▼
[ notes.json ]  ← 永続保存

この記事の範囲は点線の箱、つまり サーバー+道具定義+保存までだ。クライアント側(Claude Desktop)はすでにあるものを 登録して使う。自分で作るクライアントは次の記事の分だ。


このコンテンツは開発者以上が必要です

サインインしてプランをアップグレードすると続きを読めます。

プランを見る
Twitter