この記事の要点
- 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()を使います。
事前に用意するもの
- Windows版Claude Desktop(最新版)
- Node.js 20以上。
node --versionとnpm --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ツールを呼ぶ
- Claude Desktopを完全に終了してから再起動します。
- チャット入力欄の
+からConnectorsを開き、greetingが表示されるか確認します。 - 新しいチャットで、「greetツールを使って、コシに挨拶してください」と依頼します。
- ツール実行の承認内容を確認します。今回のツールは文字列を返すだけなので、ファイル操作や外部通信はありません。
こんにちは、コシさん。のような応答が返れば、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サーバーの構造を知るためだけの最小例です。次は次の順で進めると安全です。
- 引数を二つに増やし、入力値の検証を試す。
- 読み取り専用のローカルデータを一つだけ返すツールを作る。
- 外部APIやファイル操作を追加する前に、許可範囲、ログ、エラー処理を設計する。
既存のMCPサーバーを使う方法と、自作サーバーを作る方法は別の学習段階です。filesystem MCPを使うだけなら、Claude Desktopでfilesystem MCPを設定する方法から始めてください。公式ディレクトリや.mcpbを使う場合は、Claude Desktop Extensionsの入れ方が入口になります。
参考資料
- Model Context Protocol:Build an MCP server
- modelcontextprotocol/typescript-sdk
- Anthropic Support:Getting Started with Local MCP Servers on Claude Desktop
- Node.js:Learn Node.js
この記事を書いた人
2010年入社、インフラエンジニア17年目。Windows Server、Linux、Active Directory、仮想化、Microsoft 365、AWSなどの設計・構築・運用・テストを経験しています。現在は、生成AI、PowerShell、MCP、Claude Codeを実際に検証し、インフラ技術・業務自動化・クラウド・キャリアについて発信しています。

コメント