技術 約4分で読めます

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-loggingunknown option
原因Issue #14803(レースコンディション)

学び

「新機能が追加された」と聞いてすぐ試すのは良いが、今回のように発展途上の機能もある。GitHub の Issue を確認してから試せば無駄足を踏まずに済んだ。

とはいえ、実際に手を動かして「動かない」→「なぜ?」→「Issue 発見」という流れを経験できたのは良かった。

今後の対応

リファレンスやドキュメントをいくら整備しても、DI で疎結合にしても、結局「このメソッドどこから呼んでるんだっけ?」は分からなくなる。LSP の find references が使えるようになれば、Claude Code がコードベースを正確に追えるようになるので期待している。修正されたらまた試したい。