【Windows対応】Node.jsで最小のMCPサーバーを作る方法|Claude Desktopで自作ツールを動かす

Node.jsで自作MCPサーバーを作り、Claude Desktopへ接続する様子を表したダークブルーの技術イメージ
目次

この記事の要点

  • Claude Desktopで自作のMCPツールを動かすには、Node.jsでMCPサーバーを作り、claude_desktop_config.jsonから絶対パスで起動します。
  • この記事では、名前を受け取って挨拶を返すgreetツールだけを持つ最小サーバーを作ります。業務データ、APIキー、外部サービスは扱いません。
  • Desktop Extensionsを使うだけならローカルNode.jsが不要な場合があります。ただし、自分でNode.js製MCPサーバーを作る場合はNode.js 20以上が必要です。

Claude DesktopにMCPサーバーを接続すると、既存のツールを使うだけでなく、自分の業務に合わせたツールを作れるようになります。最初からファイル操作や外部API連携へ進む必要はありません。まずはローカルで完結する小さなgreetツールを作り、Claude Desktopから呼び出せるところまで確認しましょう。

この記事は、WindowsでNode.jsを使える状態にあり、手動JSON設定でMCPを試したい人向けです。Node.jsの導入がまだの場合は、先にWindowsでClaude DesktopとNode.jsを準備する手順を確認してください。会社PCで試す場合は、アプリの導入、MCP、ローカルツールの利用が許可されているかを必ず確認します。

Node.jsが必要になる場面を先に整理する

Claude DesktopのDesktop Extensionsは、利用するだけならClaude Desktop内蔵のNode.js環境で動くものがあります。一方で、自分でJavaScriptやTypeScriptのMCPサーバーを作り、ローカルの.mjsファイルをClaude Desktopから起動する場合は、WindowsにNode.jsが必要です。

やりたいことローカルNode.jsこの記事の対象
公式ディレクトリのDesktop Extensionを使う不要な場合がある対象外
.mcpbファイルをインストールして使う不要な場合がある対象外
JSON設定で既存のnpx製サーバーを起動する必要既存のfilesystem MCP記事
Node.jsで自作MCPサーバーを作る必要この記事

完成形:Claude Desktopと自作ツールのつながり

今回作る構成は次のとおりです。Claude Desktopとサーバーは標準入出力(stdio)でJSON-RPC通信を行います。stdioを使うサーバーでは、標準出力は通信に使われるため、console.log()を使わない点が重要です。ログを出す場合はconsole.error()を使います。

Claude Desktop、Node.js MCP Server、greetツール、ログ確認の通信経路図
Claude DesktopからNode.js製MCPサーバーのgreetツールを呼び出す最小構成

事前に用意するもの

  • Windows版Claude Desktop(最新版)
  • Node.js 20以上。node --versionnpm --versionで確認します。
  • PowerShellまたはWindows Terminal
  • Visual Studio Codeなどのテキストエディター

最初の練習では、業務フォルダ、OneDrive同期フォルダ、APIキー、社内情報を扱いません。Documents\mcp-greeting-serverのような新しい空フォルダを使います。

Step 1:Node.jsプロジェクトを作る

PowerShellを開き、次を実行します。フォルダ名は任意ですが、以降の設定と合わせるため、ここではmcp-greeting-serverとします。

cd $HOME\Documents
mkdir mcp-greeting-server
cd mcp-greeting-server
npm init -y
npm install @modelcontextprotocol/server zod

@modelcontextprotocol/serverはMCPサーバーを作る公式SDKです。zodは、ツールの入力値を定義するために使います。

Step 2:package.jsonをES Modulesにする

作成されたpackage.jsonを開き、"type": "module"と起動スクリプトを追加します。ほかの項目はそのままで構いません。

{
  "name": "mcp-greeting-server",
  "version": "1.0.0",
  "type": "module",
  "scripts": {
    "start": "node server.mjs"
  }
}

Step 3:最小のMCPサーバーを書く

プロジェクトフォルダにserver.mjsを作成し、次のコードを貼り付けます。greetツールは、nameを受け取り、日本語の挨拶を返すだけです。

import { McpServer } from "@modelcontextprotocol/server";
import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
import * as z from "zod/v4";

const server = new McpServer({
  name: "greeting-server",
  version: "1.0.0",
});

server.registerTool(
  "greet",
  {
    description: "指定した名前へ挨拶を返します。",
    inputSchema: z.object({
      name: z.string().min(1).describe("挨拶する相手の名前"),
    }),
  },
  async ({ name }) => ({
    content: [{ type: "text", text: `こんにちは、${name}さん。` }],
  }),
);

async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("Greeting MCP server is ready.");
}

main().catch((error) => {
  console.error("Fatal error:", error);
  process.exit(1);
});

このコードでは、console.log()を使いません。stdio方式では標準出力がClaude DesktopとのJSON-RPC通信に使われるため、console.log()を出すと通信が壊れる可能性があります。状態を確認するログはconsole.error()へ出します。

Step 4:サーバー単体で起動を確認する

まだClaude Desktopには接続せず、まずサーバー自体が起動するかを確認します。

npm start

Greeting MCP server is ready.と表示され、プロンプトが戻らず待機状態になれば正常です。これはClaude Desktopからの通信を待っているためです。確認後はCtrl + Cで停止します。

Step 5:Claude Desktopの設定へ追加する

Claude Desktopの設定ファイルを開きます。Windowsでは次の場所です。

%APPDATA%\Claude\claude_desktop_config.json

既にmcpServersがある場合は、その中へgreetingを追加します。下記のC:\Users\username\Documents\mcp-greeting-serverは例なので、必ず自分のWindowsユーザー名と実際の絶対パスへ置き換えてください。

{
  "mcpServers": {
    "greeting": {
      "command": "node",
      "args": [
        "C:\\Users\\username\\Documents\\mcp-greeting-server\\server.mjs"
      ]
    }
  }
}

JSON内のWindowsパスは、バックスラッシュを\\と二重に書きます。既存サーバーがある場合は、JSONのカンマや波かっこを壊さないよう注意してください。

Step 6:Claude Desktopからgreetツールを呼ぶ

  1. Claude Desktopを完全に終了してから再起動します。
  2. チャット入力欄のからConnectorsを開き、greetingが表示されるか確認します。
  3. 新しいチャットで、「greetツールを使って、コシに挨拶してください」と依頼します。
  4. ツール実行の承認内容を確認します。今回のツールは文字列を返すだけなので、ファイル操作や外部通信はありません。

こんにちは、コシさん。のような応答が返れば、Node.jsで作った自作MCPサーバーがClaude Desktopから動いています。

表示されない時の確認順

症状最初に確認すること
Connectorsに表示されないClaude Desktopの完全再起動、設定ファイルの場所、JSON構文、絶対パスを確認する。
nodeが見つからないPowerShellでnode --versionを実行し、新しいターミナルを開き直す。
サーバーが起動しないプロジェクトフォルダでnpm startを実行し、依存関係とエラーを確認する。
ツールが使えないサーバーの標準出力へ余計な文字を出していないか、console.log()を使っていないか確認する。

より詳しいログの場所、JSON設定、Node.js・npxの切り分けは、Claude DesktopのMCPが接続できない時の確認順を確認してください。

次に進むなら

今回のgreetツールは、MCPサーバーの構造を知るためだけの最小例です。次は次の順で進めると安全です。

  1. 引数を二つに増やし、入力値の検証を試す。
  2. 読み取り専用のローカルデータを一つだけ返すツールを作る。
  3. 外部APIやファイル操作を追加する前に、許可範囲、ログ、エラー処理を設計する。

既存のMCPサーバーを使う方法と、自作サーバーを作る方法は別の学習段階です。filesystem MCPを使うだけなら、Claude Desktopでfilesystem MCPを設定する方法から始めてください。公式ディレクトリや.mcpbを使う場合は、Claude Desktop Extensionsの入れ方が入口になります。

参考資料

この記事を書いた人

2010年入社、インフラエンジニア17年目。Windows Server、Linux、Active Directory、仮想化、Microsoft 365、AWSなどの設計・構築・運用・テストを経験しています。現在は、生成AI、PowerShell、MCP、Claude Codeを実際に検証し、インフラ技術・業務自動化・クラウド・キャリアについて発信しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

2010年入社、インフラエンジニア17年目。

Windows Server、Linux、Active Directory、仮想化、
Microsoft 365、AWSなどの設計・構築・運用・テストを経験しています。
現在は、生成AI、PowerShell、MCP、Claude Codeを実際に検証し、
インフラ技術・業務自動化・クラウド・キャリアについて発信しています。

コメント

コメントする

目次