Claude Code v2.0.74 の LSP 機能を PHP で試したら既知のバグだった
Claude Code v2.0.74 で LSP(Language Server Protocol)機能が追加されたと聞いて、PHP 環境で試してみた。結論から言うと動かなかったが、調べた結果「既知のバグ」だと分かった。その過程を記録しておく。
LSP 機能とは
LSP は IDE のコード補完や定義ジャンプを実現するプロトコル。Claude Code v2.0.74 のリリースノートには以下の機能が追加されたとある:
- go-to-definition - 定義へジャンプ
- find references - 参照検索
- hover documentation - ホバー時のドキュメント表示
これが使えれば、Claude Code がコードベースをより正確に理解できるようになる。grep 検索よりも型情報を活用した精度の高い解析が期待できる。
検証環境
- Windows 11
- PHP 8.3.27
- Composer 2.9.1
- Claude Code 2.0.74
phpactor を試す → 失敗
まず PHP 用の LSP サーバーとして phpactor を試した。
composer global require phpactor/phpactor
結果:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- phpactor/phpactor requires ext-pcntl * -> it is missing from your system.
ext-pcntl は Unix 系のプロセス制御拡張で、Windows では使えない。
WSL(Ubuntu 22.04)は入っているので試せなくはないが、普段の開発では Docker を使っている。テスト環境なら Docker で作って即消したいところだが、Claude Code の LSP 検証のためだけに Docker 環境を整えるのも面倒。結局どっちも手間なので断念した。
intelephense を試す → インストール成功、認識されず
次に Node.js ベースの intelephense を試した。
npm install -g intelephense
インストールは成功。テスト用の PHP プロジェクトを作成し、Claude Code で試してみた。
パターン1:ディレクトリを指定して指示
php-lsp-testフォルダ内でUserController の UserService の定義に飛んで
パターン2:フォルダを開いてから指示
VSCode で php-lsp-test フォルダを新しいウィンドウで開いてから指示。
UserController の UserService の定義に飛んで
結果: どちらも LSP は使われず、Glob + Read でファイル検索して対応していた。
具体的には、Claude Code は以下のような動作をした:
Glob pattern: "**/*.php"
Found 4 files
Read src/Controller/UserController.php
Read src/Service/UserService.php
LSP の go-to-definition が使われていれば、ファイル一覧を取得せずに直接定義箇所にジャンプできるはず。しかし実際には Glob でファイルを列挙し、Read で中身を読んで、テキストベースで定義を探していた。これは LSP なしの従来の動作と同じ。
設定を調べる
--enable-lsp-logging というフラグがあるらしいと聞いて試したが:
claude --enable-lsp-logging
error: unknown option '--enable-lsp-logging'
存在しなかった。
GitHub Issue を発見
調べたところ、同様の問題が Issue #14803 で報告されていた(2025-12-20、つまり昨日)。
問題の原因
レースコンディション - LSP Manager がプラグインのロード完了前に初期化される
デバッグログ:
LSP notification handlers registered for 0 servers
(52ms 後)
Plugin loading begins...
つまり、LSP の初期化時にプラグインがまだ読み込まれていないため、「利用可能な LSP サーバー: 0」という状態になる。
リグレッション
- v2.0.67 では動いていた
- v2.0.69 以降で壊れた
Issue のステータスは OPEN(未解決) 。
検証結果まとめ
| 項目 | 結果 |
|---|---|
| phpactor インストール | Windows で ext-pcntl 必要、失敗 |
| intelephense インストール | 成功 |
| Claude Code で LSP 使用 | 認識されず(Glob+Read にフォールバック) |
--enable-lsp-logging | unknown option |
| 原因 | Issue #14803(レースコンディション) |
学び
「新機能が追加された」と聞いてすぐ試すのは良いが、今回のように発展途上の機能もある。GitHub の Issue を確認してから試せば無駄足を踏まずに済んだ。
とはいえ、実際に手を動かして「動かない」→「なぜ?」→「Issue 発見」という流れを経験できたのは良かった。
今後の対応
- 公式の修正を待つ
- または Piebald-AI/claude-code-lsps のワークアラウンドを試す(
npx tweakcc --apply)
リファレンスやドキュメントをいくら整備しても、DI で疎結合にしても、結局「このメソッドどこから呼んでるんだっけ?」は分からなくなる。LSP の find references が使えるようになれば、Claude Code がコードベースを正確に追えるようになるので期待している。修正されたらまた試したい。