Claude Codeで初めてのMCPサーバーを作る:ステップバイステップ完全ガイド
MCPサーバーの仕組みからローカルでの動作確認まで、Claude Codeを使って初めてのMCPサーバーを実装する手順を丁寧に解説します。ゼロ知識からでも動くものが作れます。
MCPサーバーって、結局何なのか
正直に言うと、「MCP」という言葉を最初に聞いたとき、またAI業界の流行語か、と思った人も多いはずだ。実は違う。MCP(Model Context Protocol)は、Anthropicが策定したオープンプロトコルで、AIモデルが外部ツールやデータソースと標準化された方法で連携するための基盤だ。一言でいえば「AIが自分でデータを取りに行くための共通言語」である。
これまでのプロンプトエンジニアリングの世界では、「情報をコピーして貼り付けてから質問する」という手順が当たり前だった。在庫データを確認したければ、自分でシステムにログインして数字をコピーし、ChatGPTやClaudeに貼り付けて「これを分析して」とお願いする。実際やってみると、この工程が地味に時間を食う。コピー忘れ、貼り付けミス、最新情報との乖離——ミスの温床でもある。
MCPサーバーを自作することで、Claude CodeやClaude Desktopから独自のデータベース・社内API・専用ツールを直接呼び出せるようになる。「在庫を確認して」と入力するだけで、AIが自律的にデータを取りに行き、分析結果を返してくれる。このワークフローの変化は、一度体験すると以前には戻れない。
技術的な敷居については心配しなくていい。最小構成のMCPサーバーは50行程度のコードで動く。本記事を最後まで読めば、あなたも今日中に動くものが作れる状態になる。
開発環境のセットアップ——10分で終わる準備
MCPサーバーはNode.js(TypeScript)またはPythonで実装できる。どちらを選ぶかはあなたの好みで構わないが、エコシステムの成熟度とサンプルの豊富さから、Node.js + TypeScriptをおすすめしたい。実際、公式SDKのドキュメントも TypeScript のサンプルが最も充実している。
セットアップは驚くほど単純だ。まずnpm install @modelcontextprotocol/sdkを実行してSDKをインストールする。次にsrc/index.tsにサーバーのエントリーポイントを作成し、package.jsonのscriptsに"build": "tsc"と"start": "node dist/index.js"を追加する。TypeScriptの設定はmoduleResolution: "node16"にしておくとSDKとの相性が良く、import解決でハマることがなくなる。
実際に試してみると、ここまでの作業は早い人なら5分かからない。Node.jsのバージョンは18以上を使っていれば問題ない。もしnpxコマンドが動かない場合は、まずnode --versionでバージョンを確認してほしい。Node 16以下の古いバージョンではSDKが動作しないケースがある。
プロジェクト構成はシンプルに保つのがコツだ。最初から複雑なディレクトリ構造を作ろうとすると、動く前に疲弊する。src/index.ts一枚に全部書いて動かす、それが正しい最初の一歩だ。
最初のToolを実装する——ここが本番だ
MCPサーバーの中心的な概念は「Tool」だ。Toolは関数名・説明文・入力スキーマ・実行ロジックの4要素で構成される。この4要素を正確に定義することが、AIが正しくToolを呼び出せるかどうかを決める。
たとえば社内の在庫データベースを検索するToolを作るとしよう。search_inventoryという名前で、JSON Schemaで入力(商品コードや検索キーワード)を定義し、実際のDBクエリを実装する。ここで一つ重要なことを伝えたい——説明文の質がToolの使われ方を左右する。AIは説明文を読んで「このToolを使うべきか」を判断するからだ。「在庫を検索します」より「商品コードまたはキーワードで在庫数と入荷予定日を返します」のほうが、AIはずっと正確に使える。
Claude CodeにMCPサーバーのパスを登録すると(設定ファイルへの1行追加だ)、会話中に「A-123の在庫を確認して」と入力するだけでAIが自動的にそのToolを呼び出してくれる。筆者が初めてこれを動かしたとき、AIがデータベースに接続して実際の在庫数を返してきた瞬間の興奮は、今でも覚えている。「あ、これは本当に使えるやつだ」と確信した瞬間だった。
デバッグにはclaude mcp inspectorコマンドが非常に役立つ。GUIでどのパラメーターが渡されているかを可視化できるため、「Toolは登録したのになぜか呼ばれない」という問題を素早く解決できる。開発中は常にインスペクターを開いておくことをおすすめしたい。
本番運用に向けた仕上げ——細部が信頼を作る
ローカルで動作確認できたら、次は本番利用に向けた仕上げだ。この段階をサボると、あとで「なぜ止まったかわからない」という状況に陥る。少し手間をかけておくことで、長期的に安定して使えるサーバーになる。
まずエラーハンドリングを整備する。MCPはJSONRPCベースなので、例外が発生した場合はエラーレスポンスを適切な形式で返すことが必須だ。例外をそのままスローすると、クライアント側でハンドリングできずに処理が止まってしまう。try/catchで包んで、エラーの種類に応じたメッセージを返す実装を必ず入れること。
次に認証情報の管理だ。外部APIやデータベースにアクセスするために必要なシークレット(APIキー・パスワード・トークン)は環境変数で管理し、コードにハードコードしないのは鉄則だ。.envファイルに書いてdotenvで読み込む方法が最もシンプルで、誤ってGitにコミットしてしまうリスクも低い。
チームで共有する際に特に意識してほしいのは、Toolの説明文の質だ。あなた以外の人間——あるいはAI——がそのToolを使うことを想定して書く。「このToolは何を入力すると、何を返すか」を具体的に記述することで、AIがToolの選択を正確に行えるようになり、チーム全体の生産性が上がる。