WSL環境でClaude CodeのMCPサーバー設定でハマった話と解決方法

## はじめに

Claude for DesktopとClaude CodeをMCPサーバーとして連携させようとした際に遭遇したエラーと、その解決方法について記録します。WSL環境でClaude Codeを使っている方の参考になれば幸いです。

## 環境

- Windows 11 + WSL2 (Ubuntu)
- Claude for Desktop
- Claude Code v0.2.53
- Node.js v22.14.0 (NVM管理)

## 問題の発生

Claude for DesktopからClaude CodeをMCPサーバーとして利用しようとしたところ、以下のエラーが発生しました。

### エラーログ

```
SyntaxError: Unexpected token '.'
    at Loader.moduleStrategy (internal/modules/esm/translators.js:133:18)
    at async link (internal/modules/esm/module_job.js:42:21)

2025-06-03T19:17:11.290Z [claude-code] [info] Server transport closed
2025-06-03T19:17:11.291Z [claude-code] [error] Server disconnected.

2025-06-03T19:24:22.924Z [claude-code] [error] spawn /home/moto/.nvm/versions/node/v22.14.0/bin/claude ENOENT
```

## エラーの原因分析

このエラーログから2つの主要な問題が判明しました：

### 1. JavaScriptの構文エラー
```
SyntaxError: Unexpected token '.'
```
これは実行しようとしたJavaScriptコードに文法的な問題があることを示しています。

### 2. Claude実行ファイルが見つからない
```
spawn /home/moto/.nvm/versions/node/v22.14.0/bin/claude ENOENT
```
ENOENTエラーは「No such file or directory」を意味し、指定されたパスにclaude実行ファイルが存在しないことを示しています。

## 間違った対処法（私が最初に試したこと）

最初、私は以下の対処法を試しました：

```bash
# ❌ 存在しないパッケージのインストールを試行
npm install -g @anthropic-ai/claude-mcp-server
# → npm error 404 Not Found
```

この`@anthropic-ai/claude-mcp-server`パッケージは存在せず、完全に的外れなアプローチでした。

## 正しい解決方法

### 問題の本質

WSL環境でClaude CodeをMCPサーバーとして使用する場合、**Claude for Desktop（Windows側）からWSL内のClaude Codeにアクセスする**必要があります。

直接WSL内のパスを指定するのではなく、WSLコマンドを経由してアクセスするのが正解でした。

### 正しい設定ファイル

`claude_desktop_config.json`を以下のように設定します：

```json
{
    "mcpServers": {
        "claude_code": {
            "command": "wsl",
            "args": [
                "bash",
                "-ic",
                "claude mcp serve"
            ],
            "env": {}
        }
    }
}
```

### 設定のポイント

1. **`"command": "wsl"`** - Windows側からWSLを呼び出し
2. **`"args": ["bash", "-ic", "claude mcp serve"]`** - WSL内でbashを起動し、Claude Codeのmcpサーバーモードを実行
3. **`-ic`オプション** - インタラクティブモードで、かつ設定ファイル（.bashrcなど）を読み込む

### 技術的解説：なぜ直接パス指定では動作しないのか

#### 間違っていた設定とその理由

```json
// ❌ 直接WSL内のパスを指定（動作しない）
{
    "mcpServers": {
        "claude_code": {
            "command": "/home/moto/.nvm/versions/node/v22.14.0/bin/claude",
            "args": ["mcp", "serve"],
            "env": {}
        }
    }
}
```

**なぜこの設定では動作しないのか？**

```
Windows 10/11 環境
┌─────────────────────────────────────────┐
│ Claude for Desktop (Windows)           │
│ ┌─────────────────────────────────────┐ │
│ │ claude_desktop_config.json          │ │
│ │ {                                   │ │
│ │   "command": "/home/moto/..."       │ │ ← Windows側から直接WSLパスを指定
│ │ }                                   │ │    これは不可能！
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────┘
              │ ❌ 直接アクセス不可
              ▼
┌─────────────────────────────────────────┐
│ WSL2 (Ubuntu)                          │
│ ┌─────────────────────────────────────┐ │
│ │ /home/moto/.nvm/.../claude          │ │
│ │ (Claude Code実行ファイル)            │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────┘
```

#### 正しい設定とアーキテクチャ

```json
// ✅ WSLコマンド経由（動作する）
{
    "mcpServers": {
        "claude_code": {
            "command": "wsl",
            "args": ["bash", "-ic", "claude mcp serve"],
            "env": {}
        }
    }
}
```

**正しいアーキテクチャ：**

```
Windows 10/11 環境
┌─────────────────────────────────────────┐
│ Claude for Desktop (Windows)           │
│ ┌─────────────────────────────────────┐ │
│ │ claude_desktop_config.json          │ │
│ │ {                                   │ │
│ │   "command": "wsl",                 │ │ ← WSLコマンドを実行
│ │   "args": ["bash", "-ic", "claude"] │ │
│ │ }                                   │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────┘
              │ ✅ WSL経由でアクセス
              ▼
┌─────────────────────────────────────────┐
│ WSL2 (Ubuntu)                          │
│ ┌─────────────────────────────────────┐ │
│ │ wsl.exe が以下を実行:               │ │
│ │ bash -ic "claude mcp serve"         │ │
│ │   │                                 │ │
│ │   └─→ PATHからclaude を検索        │ │
│ │       /home/moto/.nvm/.../claude    │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────┘
```

#### 技術的なポイント

1. **プロセス境界の理解**
   - Windows側のプロセス（Claude for Desktop）
   - WSL側のプロセス（Claude Code）
   - この2つは異なるファイルシステム空間に存在

2. **パス解決の仕組み**
   ```bash
   # ❌ Windows側から直接WSLパスは認識できない
   /home/moto/.nvm/versions/node/v22.14.0/bin/claude
   
   # ✅ WSL経由でPATH環境変数を使用
   wsl bash -ic "claude"  # → PATHから自動解決
   ```

3. **`-ic`オプションの重要性**
   - `-i`: インタラクティブモード（環境変数を正しく読み込み）
   - `-c`: コマンド実行モード
   - これにより`.bashrc`や`.profile`の設定（NVMのPATH設定等）が反映される

#### MCPサーバーの通信フロー

```
┌─────────────────┐    JSON-RPC     ┌─────────────────┐
│ Claude Desktop  │ ←──────────────→ │ Claude Code     │
│ (Windows)       │    over stdio   │ (WSL)           │
└─────────────────┘                 └─────────────────┘
         │                                   │
         │ 1. wsl bash -ic "claude mcp serve" │
         │ 2. stdio パイプ接続                │
         │ 3. JSON-RPC メッセージ交換         │
         │ 4. ファイルシステム操作要求         │
         │ 5. 結果をJSON形式で返送            │
```

#### AIが提示した設定の妥当性

実は、AIが最初に提示した直接パス指定の設定も**理論的には正しい考え方**でした：

**正しい部分：**
- MCPサーバーの基本的な設定構造
- `command`と`args`の使い分け
- 環境変数の設定方法

**環境固有の問題：**
- Windows + WSL環境での特殊事情を考慮していない
- プロセス境界とファイルシステム境界の違い

この経験から、**環境固有の制約を理解することの重要性**が分かります。

## 動作確認

### 1. Claude Codeのインストール確認

まず、WSL内でClaude Codeが正しくインストールされていることを確認：

```bash
# WSL内で実行
claude -v
# 出力例: 0.2.53 (Claude Code)
```

### 2. Windows側からのアクセス確認

PowerShellからWSL経由でClaude Codeにアクセスできることを確認：

```powershell
# PowerShellで実行
wsl bash -ic "claude -v"
# 出力例: 0.2.53 (Claude Code)
```

### 3. Claude for Desktopの再起動

設定ファイルを保存後、Claude for Desktopを完全に再起動します。

### 4. 接続確認

Claude for Desktopを開くと、トンカチマーク（🔨）が表示され、「ソースサーバー：claude_code」として利用可能なツールが一覧表示されるようになります。

## 実際の使用例

```
/home/moto/my-project 内のプロジェクトフォルダを見て、プロジェクトの概要を教えてください。
```

このようにプロンプトを入力すると、Claude CodeがWSL内のファイルを参照して回答を生成してくれます。

## 学んだこと

### 1. 環境の境界を意識する
Windows（Claude for Desktop）とWSL（Claude Code）という異なる環境間での連携では、適切なブリッジ（WSLコマンド）が必要でした。

### 2. 公式ドキュメントの重要性
存在しないパッケージを探すよりも、既存の成功事例や公式の推奨設定を参考にすることが重要でした。

### 3. エラーログの正しい読み方
複数のエラーが同時に発生している場合、根本原因を特定して適切に対処することが大切でした。

## まとめ

WSL環境でClaude CodeをMCPサーバーとして使用する際は：

- ✅ WSLコマンドを経由してアクセスする
- ✅ 正しい`claude_desktop_config.json`の設定を使用する
- ✅ 設定後は必ずClaude for Desktopを再起動する
- ❌ 直接WSL内のパスを指定しない
- ❌ 存在しないnpmパッケージを探さない

この設定により、Claude for DesktopからClaude Codeの強力な機能をシームレスに活用できるようになります。

## 参考リンク

- [Claude for Desktop](https://claude.ai/download)
- [Claude Code公式ドキュメント](https://docs.anthropic.com/en/docs/build-with-claude/claude-code)
- [MCP（Model Context Protocol）](https://modelcontextprotocol.io/)

---

同じ問題で困っている方の助けになれば幸いです！