Windows環境の Claude Code で graft の MCP サーバーを導入した際、起動直後に CONNECTION_CLOSED と表示されて即切断される事象が発生しました。
設定ファイル(.mcp.json)の記述を見直しても解決せず、原因を探ったところ npx 経由の実行時におけるファイルロックエラーであることが分かりました。本記事ではその回避手順と切り分け方法をまとめています。
発生原因(EBUSY エラー)
npx -y @nanonets/graft@latest で実行すると、一時領域へのパッケージ展開や依存ライブラリ(tree-sitter-cli)のリネーム処理が走ります。
Windows ではこのタイミングでファイルロックに引っかかり、EBUSY エラーを起こして親プロセスごとクラッシュしていたのが原因でした。
そのため、グローバルインストールしたバッチファイルを直接叩く構成に切り替えることで回避できます。
解決手順
※ 以下の環境で動作確認を行っています。
- Node.js: 24.13.1
- graft: 0.16.0
- 前提環境: Visual Studio 2019 (C++ ビルドツール導入済み)
1. PowerShell でグローバルインストール
依存パッケージである tree-sitter-kotlin のネイティブビルドを落とさないよう、PYTHON 環境変数を明示してインストールします。
$env:PYTHON = "C:\Python313\python.exe" # パスは各自の環境に合わせて書き換えてください
npm i -g @nanonets/graft
補足:
npm 11以降ではnpm config set pythonが利用できないため、$env:PYTHONでnode-gypに直接パスを渡しています。
2. .mcp.json を実行ファイルの直接指定に書き換える
Claude Code の設定ファイルを編集し、グローバルインストールで生成された graft.cmd を直接呼び出すよう変更します。
{
"mcpServers": {
"graft": {
"command": "C:\\Users\\<user>\\AppData\\Roaming\\npm\\graft.cmd",
"args": ["mcp"]
}
}
}
※ <user> はご自身の Windows ユーザー名に置き換えてください。
これで一時展開のファイル処理を挟まずに起動できるようになります。
うまくいかないときの切り分け手順
設定後、Claude Code から起動する前に PowerShell から stdio 経由で MCP サーバー単体の疎通を確認できます。
以下のコマンドで初期化要求(initialize)を直接流し込みます。
'{"jsonrpc":"2.0","id":"check","method":"initialize","params":{}}' | & "C:\Users\<user>\AppData\Roaming\npm\graft.cmd" mcp
正常時のレスポンス
正常に動作していれば、以下のように serverInfo を含む JSON-RPC レスポンスが返ってきます。
{"jsonrpc":"2.0","id":"check","result":{"protocolVersion":"...","capabilities":{...},"serverInfo":{"name":"graft",...}}}
返ってくる文字列に serverInfo が含まれていれば、graft.cmd のパス疎通および MCP サーバーとしての動作は問題ありません。
何も返ってこない場合や例外ログが出る場合は、指定したパスや Python の環境変数周りを再確認してください。