# Claude Code LSPの使い方：プラグイン導入と動かないときの対処

> Claude CodeのLSPは、言語サーバーを自分で入れて公式プラグインを追加すると動きます。ENABLE_LSP_TOOLは不要で、2.1.316では効果もありません。

- URL: https://blog.laozhang.ai/ja/posts/claude-code-lsp
- Published: 2026-11-02
- Updated: 2026-11-02
- Author: LaoZhang AI Team (https://blog.laozhang.ai/ja/about)
- Topic: Claude Code
- Tags: Claude Code, LSP, プラグイン, 言語サーバー, 開発ツール

---
2026年11月2日時点のClaude Code（2.1.316）でLSPを使う方法は、環境変数を設定することではなく、二つのものを入れることです。一つは自分のマシンに入れる言語サーバー（TypeScriptなら`npm install -g typescript-language-server typescript`）、もう一つはClaude Codeにその言語サーバーの起動方法を伝える公式の「コード インテリジェンス プラグイン」で、ターミナルのClaude Codeで`/plugin install typescript-lsp@claude-plugins-official`と入力して入れます。PythonやGo、Java、C#なら、`pyright-lsp`や`gopls-lsp`のように言語ごとのプラグイン名に置き換えます。古い記事にある`ENABLE_LSP_TOOL`は不要です。

入れたあとにClaudeが得るものは二つあります。ファイルを編集するたびに自動で届く型エラーなどの診断と、定義や参照をたどる`LSP`ツールです。診断は何もしなくても届きますが、`LSP`ツールはClaudeが呼ぶかどうかを自分で判断します。動いているかは、Claudeにわざと型エラーを入れさせ、会話に`Found 1 new diagnostic issue in 1 file (ctrl+o to expand)`のような行が出るかで確かめます。

インストールが`Plugin "typescript-lsp" not found in marketplace "claude-plugins-official"`で失敗したときは、先に`/plugin marketplace add anthropics/claude-plugins-official`で公式マーケットプレイスを登録します。クラウドセッションでは言語サーバーが起動しないため、この機能自体が使えません。入れたのに何も変わらない場合は、言語サーバーがPATHにない、プロジェクトに必要なパッケージがないなど原因がいくつかあり、症状ごとに後半の対応表で切り分けられます。

## LSPは言語サーバーとプラグインの組み合わせ：Claudeが得る2つの情報

Claude CodeのLSP対応で一番混同されやすいのは、言語サーバーとプラグインが別物だという点です。言語サーバーは`typescript-language-server`や`pyright-langserver`、`gopls`のような独立したプログラムで、エディターの補完やエラー表示を支えているものと同じです。コード インテリジェンス プラグインは、どのコマンドで言語サーバーを起動し、どの拡張子のファイルを任せるかをClaude Codeに伝える設定にすぎず、[Claude Codeの公式ドキュメント「コード インテリジェンス プラグイン」](https://code.claude.com/docs/ja/plugins/code-intelligence)にも、プラグインに言語サーバーは含まれないと書かれています。プラグインだけを入れても、言語サーバーが手元になければ何も起きません。

言語サーバーが動いていると、Claudeは二種類の情報を受け取ります。一つ目はClaudeがファイルを編集または作成するたびに届く診断で、自分が入れてしまった型エラー、足りないimport、構文エラーを、コンパイラを走らせずに知ることができます。二つ目は`LSP`ツールで、テキスト検索の代わりにシンボル単位で定義へのジャンプ、参照の一覧、型情報の表示、呼び出し階層の追跡ができます。公式の[ツールリファレンスのLSPツールの説明](https://code.claude.com/docs/en/tools-reference#lsp-tool-behavior)によると、このツールは読み取り専用で、実行時に権限の確認は出ません。

![言語サーバーと公式プラグインを自分で入れると、Claude Codeを通じて自動の診断とLSPツールの2つがClaudeに届く関係図](https://blog.laozhang.ai/posts/ja/claude-code-lsp/img/lsp-server-plugin-roles.webp)

LSPとMCPはどちらもClaude Codeに機能を足す仕組みですが、LSPは言語サーバー専用の接続で、外部サービスやデータにつなぐのはMCPの役割です。MCPから何を入れるか迷っている場合は[Claude CodeのおすすめMCP：最初に入れる一つを作業別に選ぶ](https://blog.laozhang.ai/ja/posts/claude-code-best-mcp-servers)を参照してください。

## 導入手順：言語サーバー → プラグイン → 診断行で確認

導入は「言語サーバーを入れる、プラグインを入れる、サーバーが起動したかを確かめる」の順で進めます。順番を逆にしても壊れはしませんが、言語サーバーがない状態でプラグインだけ入れると、Claudeの会話には何のエラーも出ないため、原因が分かりにくくなります。Claude Code本体がまだなら、先に[Claude Codeのインストール方法と始め方：セットアップと最初の起動](https://blog.laozhang.ai/ja/posts/claude-code-install)で起動まで済ませてください。

1. 次の節の対応表で自分の言語の行を探し、言語サーバーをインストールします。TypeScriptとJavaScriptなら`npm install -g typescript-language-server typescript`です。
2. `claude`を起動するのと同じシェルで、言語サーバーがPATH上にあるかを確かめます。macOSやLinuxなら`which typescript-language-server`、PowerShellなら`Get-Command typescript-language-server`で、パスが表示されれば問題ありません。
3. ターミナルで`claude`を起動し、プロンプトで次のように入力します。`typescript-lsp`の部分は自分の言語のプラグイン名に置き換えます。

   ```text
   /plugin install typescript-lsp@claude-plugins-official
   ```

4. すぐには入らず、`/plugin`画面でそのプラグインの詳細が開きます。自分だけで使うなら**Install for you**（ユーザースコープ）を選びます。リポジトリの共同作業者にも有効にしたいなら**Install for all collaborators on this repository**（共同作業者はそれぞれ言語サーバーを入れ、`claude plugin install typescript-lsp@claude-plugins-official --scope project`を一度実行する必要があります）、このリポジトリで自分だけなら**Install for you, in this repo only**です。完了後に`Run /reload-plugins to apply.`と出ても、LSPツールが増える再読み込みはそのままでは実行されず、`This reload adds the LSP tool`という警告とともに`/reload-plugins --force`を求められます。新しいセッションを始めるか、`/reload-plugins --force`を実行します。
5. Claudeに「このファイルにわざと型エラーを入れてから直して」と頼み、会話に`Found 1 new diagnostic issue in 1 file (ctrl+o to expand)`のような行が出れば、言語サーバーは起動しています。行が出なければ、`/plugin`を開いて**Errors**タブを確認します。

言語サーバーは、Claudeがそのプラグインの拡張子のファイルを初めて扱ったときに起動します。VS Code拡張機能やデスクトップアプリから入れる場合は、手順3の代わりにそれぞれのプラグイン画面を使います（`/plugin install`の画面の見方は[Claude CodeのおすすめSkills：用途別の選び方と公式スキルの導入手順](https://blog.laozhang.ai/ja/posts/claude-code-best-skills)でも扱っています）。`--force`を付けて再読み込みすると、次のメッセージで会話全体をキャッシュなしで読み直すことになるため、長い会話の途中なら新しいセッションのほうが無難です。その理由は[Claude Code のキャッシュミスと token コスト：1 回の turn が急に高く見える理由](https://blog.laozhang.ai/ja/posts/claude-code-cache-miss-token-costs)で説明しています。

## 言語別のプラグインと言語サーバー：13言語の対応表

2026年11月2日時点で公式マーケットプレイスにあるコード インテリジェンス プラグインは13言語分です。Liquid用の`liquid-lsp`はShopifyが保守し、それ以外はAnthropicが保守しています。インストールコマンドは、公式マーケットプレイス（2026年10月30日のコミット）にある各プラグインのREADMEに書かれているものです。

| 言語 | プラグイン | 言語サーバー | インストールコマンド（README記載） |
| --- | --- | --- | --- |
| TypeScript / JavaScript | `typescript-lsp` | `typescript-language-server` | `npm install -g typescript-language-server typescript` |
| Python | `pyright-lsp` | `pyright-langserver` | `npm install -g pyright`、`pip install pyright`、`pipx install pyright` のいずれか |
| Go | `gopls-lsp` | `gopls` | `go install golang.org/x/tools/gopls@latest` |
| Rust | `rust-analyzer-lsp` | `rust-analyzer` | `rustup component add rust-analyzer`（brew、apt、pacmanも可） |
| Java | `jdtls-lsp` | `jdtls` | `brew install jdtls`（Java 17以上のJDKが必要。Linuxは手動導入が中心で、`jdtls`のラッパーをPATHに置く） |
| C# | `csharp-lsp` | `csharp-ls` | `dotnet tool install --global csharp-ls`（.NET SDK 6.0以上が必要） |
| C / C++ | `clangd-lsp` | `clangd` | `brew install llvm`、`sudo apt install clangd`、`winget install LLVM.LLVM` |
| Kotlin | `kotlin-lsp` | `kotlin-lsp` | `brew install JetBrains/utils/kotlin-lsp` |
| PHP | `php-lsp` | `intelephense` | `npm install -g intelephense` |
| Ruby | `ruby-lsp` | `ruby-lsp` | `gem install ruby-lsp` |
| Lua | `lua-lsp` | `lua-language-server` | `brew install lua-language-server`（snap、pacman、dnfも可） |
| Swift | `swift-lsp` | `sourcekit-lsp` | Swiftツールチェーンに同梱（Xcode、または`brew install swift`。Linuxはswift.orgから） |
| Liquid | `liquid-lsp` | `shopify` | Shopify CLIをインストール |

プラグインを入れるときは、どの言語でも`/plugin install プラグイン名@claude-plugins-official`の形です。JavaとKotlinは起動に時間がかかるため、マーケットプレイスの設定で起動待ちの上限（`startupTimeout`）が120,000ミリ秒に延ばされています。表にない言語は、後半の`.lsp.json`の節の手順で自分で追加できます。

## `ENABLE_LSP_TOOL`はもう不要：2.1.316ではどちら向きにも効かない

`settings.json`の`env`に`"ENABLE_LSP_TOOL": "1"`を書く手順は、LSPツールが入ったばかりのころの名残です。Claude Codeの変更履歴によると、`LSP`ツールは2025年12月19日の2.0.74で追加されました。現在の[ツールリファレンス](https://code.claude.com/docs/en/tools-reference#lsp-tool-behavior)は、言語のコード インテリジェンス プラグインを入れるまでこのツールは無効のままだと説明しており、[Claude Codeの環境変数リファレンス](https://code.claude.com/docs/en/env-vars)にもこの変数は載っていません。一方で、karanbansal.inの[Claude Code LSPの解説記事](https://karanbansal.in/blog/claude-code-lsp/)（2026年2月28日）は、GitHub issue #15619発の非公式な回避策として今もこのフラグを書き込むよう案内しています。Scott Spenceは2026年10月10日の[「Revisiting LSP in Claude Code」](https://scottspence.com/posts/revisiting-lsp-in-claude-code)で、フラグを外しても2.1.296でLSPが読み込まれると報告しています。

2026年11月2日にmacOSのClaude Code 2.1.316で、普段とは別の設定ディレクトリを使い、ローカルのモック APIにつないで（実際のモデルは呼ばずに）TypeScriptの3ファイルのプロジェクトで確かめたところ、このフラグはどちら向きにも効きませんでした。プラグインを入れた状態で`ENABLE_LSP_TOOL=0`にしてもLSPツールは提供され、診断も届きました。逆にプラグインを無効にして`ENABLE_LSP_TOOL=1`にすると、LSPツールは出ず、デバッグログには`Total LSP servers loaded: 0`と出ました。LSPを有効にするのはプラグインで、フラグを書いても書かなくても結果は変わりません。以下の確認結果も、特に断りがない限りこの環境でのものです。

## `not found in marketplace`エラー：公式マーケットプレイスを登録する

インストールで`Plugin "typescript-lsp" not found in marketplace "claude-plugins-official"`や`Marketplace "claude-plugins-official" not found`が出るのは、公式マーケットプレイスがまだ登録されていないときです。[Claude Codeのプラグインのトラブルシューティング](https://code.claude.com/docs/en/plugins/troubleshooting)によると、公式マーケットプレイスは対話型のターミナルセッションを初めて起動したときに自動で登録されます。そのため、VS Code拡張機能しか使ったことがない場合、ポリシーでそのソースが禁止されている場合、`CLAUDE_CODE_DISABLE_OFFICIAL_MARKETPLACE_AUTOINSTALL`を設定している場合、前回の登録に失敗して再試行待ちの場合は登録されていません。シェルから実行する`claude plugin`コマンドは、登録を代わりにしてくれません。

2026年11月2日に、一度も対話型セッションを起動していない新しい設定でシェルから`claude plugin install typescript-lsp@claude-plugins-official`を実行すると、このエラーに加えて`Your local copy may be out of date — try claude plugin marketplace update claude-plugins-official`と表示されました。ところが、勧められたとおり`claude plugin marketplace update claude-plugins-official`を実行しても`Marketplace 'claude-plugins-official' not found. Available marketplaces: anthropic-plugin-directory`で失敗し、登録済みは`anthropic-plugin-directory`だけでした。効いたのはマーケットプレイスの追加です。

```text
/plugin marketplace add anthropics/claude-plugins-official
```

シェルからなら`claude plugin marketplace add anthropics/claude-plugins-official`です。`Successfully added marketplace: claude-plugins-official`と出たあとにインストールをやり直すと、`typescript-lsp@claude-plugins-official (scope: user)`として入り、`claude plugin list`ではバージョン1.0.0、有効の状態になりました。エラー文が勧める`marketplace update`は、マーケットプレイスが登録済みで中身が古いときの対処で、未登録のときには使えません。

## Claudeが受け取る診断とLSPツール：会話の表示で動作を確かめる

診断は、Claudeが編集したその場のツール結果には入っていませんでした。モック APIに送られてきたリクエストを保存して確かめると、`.ts`ファイルを書いた直後のツール結果にはファイル作成の成功だけがあり、診断は次のターンに別のシステムメッセージとして届いていました。モデルが受け取った原文は次のとおりです。

```text
<new-diagnostics>The following new diagnostic issues were detected:

checkout.ts:
  ✘ [Line 3:43] Argument of type 'string' is not assignable to parameter of type 'number'. [2345] (typescript)</new-diagnostics>
```

このときの言語サーバーは、初期化に69ミリ秒、ファイルを開いてから診断を返すまで約0.58秒でした（3ファイルの小さなプロジェクトでの値です）。Claudeが型エラーを直したあと、言語サーバーは0件の診断を返し、Claude Codeは空の診断を送りませんでした。「直った」というメッセージは届きません。ただし、診断が届かないからといって、編集にエラーがないとは限りません。Scott Spenceの報告では、編集が最後の操作だった短いセッションでは型エラーが報告されないまま終わり、長いセッションでは約30秒後に届いた例もありました。また、Bashでシェルから変更したファイル（`git checkout`やフォーマッターによる変更も含む）は言語サーバーに伝わらないことがあるとしています。

ターミナルの画面では、`Found 1 new diagnostic issue in 1 file (ctrl+o to expand)`の行がWriteの行の下ではなく、その次のツールの行（「Ran 1 shell command」）の下に出ました。公式ドキュメントは「エラーを入れた編集の下に出る」と説明していますが、診断が非同期で届くため、一行遅れて表示されることがあります。問題の中身を読むには**Ctrl+O**を押します。

`LSP`ツールのほうは、最初からツール一覧に並んでいるわけではありません。`.ts`ファイルを初めて書いた（または読んだ）あと、Claude Codeは「ToolSearchで使えるツール」として`LSP`を知らせるだけで、ツールの詳しい定義はClaudeがToolSearchで呼び出したときに初めて送られます。使える操作は`goToDefinition`、`findReferences`、`hover`、`documentSymbol`、`workspaceSymbol`、`goToImplementation`、`prepareCallHierarchy`、`incomingCalls`、`outgoingCalls`の9つで、行と列は1始まりで指定します。サーバーが準備できたあとの結果は次のとおりでした。

| 操作 | 返ってきた結果 |
| --- | --- |
| `goToDefinition` | `Defined in src/price.ts:1:17` |
| `findReferences` | `Found 5 references across 3 files` |
| `hover` | `(alias) priceWithTax(amount: number, rate: number): number` |
| `workspaceSymbol`（`priceWith`で検索） | `priceWithTax (Function) - Line 1` |
| `incomingCalls` | 呼び出し元2件 |
| `goToDefinition`（README.mdに対して） | `No LSP server available for file type: .md` |

## LSPを入れたのに動かない：症状から原因と対処を引く表

LSPが動かないとき、Claude自身はたいてい何も教えてくれません。2026年11月2日の確認では、言語サーバーがPATHにない場合も、プロジェクトに`typescript`パッケージがない場合も、モデルには「`LSP`ツールが使える」という知らせだけが届き、診断もエラー文も届きませんでした。原因はClaude Codeの`/plugin`画面の**Errors**タブか、`claude --debug`で起動したときのデバッグログで探します。[Claude Codeの環境変数リファレンス](https://code.claude.com/docs/en/env-vars)によると、デバッグログは既定で`~/.claude/debug/`にセッションID名の`.txt`ファイルとして保存され、保存先は`CLAUDE_CODE_DEBUG_LOGS_DIR`（名前と違い、ディレクトリではなくファイルのパスを指定）で変えられます。

![LSPが動かないときの主な6つの症状と表示を、原因と対処に対応させた早見表](https://blog.laozhang.ai/posts/ja/claude-code-lsp/img/lsp-troubleshooting-map.webp)

| 症状 | どこで見えるか | 原因 | 対処 |
| --- | --- | --- | --- |
| インストールが`not found in marketplace "claude-plugins-official"`で失敗する | ターミナルの出力 | 公式マーケットプレイスが未登録 | `/plugin marketplace add anthropics/claude-plugins-official`のあとにインストールし直す |
| インストールは成功したが、同じセッションで何も起きない | インストール時の確認メッセージ（`restart to apply`など） | プラグインがまだ読み込まれていない | 新しいセッションを始めるか、`/reload-plugins --force`を実行する（`--force`なしの`/reload-plugins`はLSPツールを追加しない） |
| 診断行が出ない | Errorsタブやデバッグログの`Executable not found in $PATH: "typescript-language-server"` | 言語サーバーが`claude`を起動したシェルのPATHにない | 言語サーバーを入れ、PATHが通ったシェルから新しいセッションを始める |
| 診断行が出ない（TypeScript） | デバッグログの`Could not find a valid TypeScript installation` | `typescript-language-server`はあるが、プロジェクトに`typescript`がない | プロジェクトで`npm install -D typescript`を実行する |
| `LSP`ツールの結果が`server is starting`のエラーになる | Claudeが受け取るツール結果 | 言語サーバーの起動が終わる前に呼んだ | 数秒待ってから呼び直す |
| 最初の`findReferences`が定義の1件しか返さない | ツール結果の`Found 1 reference` | プロジェクトの読み込み途中に返された答え | 次の節の`useSyntaxServer`の設定を使う |
| `LSP`ツールも診断も推奨ダイアログも出ない | `/plugin`の**Installed**タブや`claude plugin list`でStatusが無効（disabled） | プラグインが無効化されている | `/plugin enable typescript-lsp@claude-plugins-official`（シェルなら`claude plugin enable typescript-lsp@claude-plugins-official`）で有効に戻し、新しいセッションを始める |
| 何をしても診断もナビゲーションも出ない | `claude --cloud`などのクラウドセッション | クラウドでは言語サーバーが起動しない | ローカルのターミナルセッションで使う |
| モノレポで、解決済みのimportが未解決と出る | 診断の内容 | 言語サーバーがそのワークスペース向けに設定されていない | Claude Code側で直すものはなく、診断があっても編集は止まらない |

`server is starting`の全文は、2026年11月2日の実行で出た`Error performing goToDefinition: Failed to sync file open …: Cannot send notification to LSP server 'plugin:typescript-lsp:typescript': server is starting`です。このときのモック APIは数ミリ秒で次の操作を返し、実際のモデルよりはるかに速かったため、最初の編集の直後に呼んだ`goToDefinition`、`findReferences`、`hover`、`workspaceSymbol`がすべてこのエラーになりましたが、4秒待ったあとは正しく返りました。実際のモデルがここまで早く呼ぶことはまれですが、起動途中の時間帯があることは覚えておく価値があります。

プラグインの設定そのものが壊れていてClaude Codeの起動に影響していると疑うときは、`claude --safe-mode`（または`CLAUDE_CODE_SAFE_MODE=1`）で起動すると、言語サーバーを含むプラグイン類を読み込まずに始められます。クラウドとローカルの実行の違いは[Claude Code に Web 版はあるのか：クラウド実行、Remote Control、Desktop を分けて考える](https://blog.laozhang.ai/ja/posts/claude-code-web-interface)で整理しています。

## 初回の`findReferences`が1件だけ：`useSyntaxServer`で回避する

TypeScriptでは、セッションで最初に呼んだ`findReferences`が、参照の一覧ではなく定義そのもの1件だけを返すことがあります。Scott Spenceの[「Revisiting LSP in Claude Code」](https://scottspence.com/posts/revisiting-lsp-in-claude-code)（2026年10月10日、Claude Code 2.1.296、SvelteKitのリポジトリ）では、新しいセッションの最初の呼び出しが19セッション中18回、さらに時間を計った13セッションではすべて`Found 1 reference`になり、2回目以降は正しい結果になりました。プロジェクトの読み込みが終わる前に問い合わせが届き、`typescript-language-server`が軽量の構文サーバーで先に答えてしまうのが原因で、Pythonの言語サーバーでも「最初は1件、そのあと全部」という同じ報告があるとしています。彼によると、Claude CodeのGitHubにはこの問題を追うissueが開いています。

2026年11月2日に、Claudeに`src/price.ts`を読ませてから同じ関数の`findReferences`を1ターンに1回ずつ3回呼ばせると、公式の`typescript-lsp`では3セッションとも最初の呼び出しが`Found 1 reference: src/price.ts:1:17`でした。正解は3ファイルにまたがる5件で、2回目と3回目も「1、5、5」「1、1、1」「1、1、5」とばらつきました。回避策は、言語サーバーの設定に次の`initializationOptions`を加えることです。

```json
{
  "typescript": {
    "command": "typescript-language-server",
    "args": ["--stdio"],
    "extensionToLanguage": { ".ts": "typescript", ".tsx": "typescriptreact", ".js": "javascript", ".jsx": "javascriptreact", ".mts": "typescript", ".cts": "typescript", ".mjs": "javascript", ".cjs": "javascript" },
    "initializationOptions": { "tsserver": { "useSyntaxServer": "never" } }
  }
}
```

この設定を入れる方法は二つあります。一つは、公式プラグインの設定が入っている`~/.claude/plugins/marketplaces/claude-plugins-official/.claude-plugin/marketplace.json`を開き、`lspServers`の`typescript`に`initializationOptions`を足す方法ですが、マーケットプレイスの更新で上書きされる可能性があります。もう一つは、上の内容を`.lsp.json`にした別のローカルプラグインを作り、公式の`typescript-lsp`を`/plugin disable typescript-lsp@claude-plugins-official`で無効にする方法で、Scott Spenceはこちらを自分のマーケットプレイスで配布しています。

2026年11月2日には後者の形で、上の`.lsp.json`を持つローカルプラグインを`claude --plugin-dir`で読み込み、公式プラグインを無効にして同じ手順を2セッション試し、どちらも「5、5、5」と最初から正しい結果になりました。Scott Spenceの測定でも12セッションすべてで最初の呼び出しが正しくなり、メモリ使用量も減った一方、最初の呼び出しは読み込みを待つぶん遅くなりました（彼のプロジェクトで約2秒）。大きなリポジトリでは待ち時間がさらに延びると考えておき、Claude Code側で修正されたら公式プラグインに戻します。

## LSP plugin recommendationダイアログ：4つの選択肢と戻し方

"LSP plugin recommendation"（公式日本語ドキュメントでは「LSP プラグイン推奨」）ダイアログは、言語サーバーはPATHにあるのに、それを使うプラグインが入っていないときに出ます。条件は、Claudeがファイルを編集したこと、追加済みのマーケットプレイスか公式マーケットプレイスにその拡張子のプラグインがあること、そのプラグインの言語サーバーが入っていることです。複数のマーケットプレイスに候補があれば公式が優先され、表示は1セッションに最大1回で、クラウドセッションでは出ません。2026年11月2日に、プラグインをアンインストールして`typescript-language-server`をPATHに置いた状態でClaudeに`.ts`ファイルを書かせると、ターンの直後にこのダイアログが出ました。プラグインを入れたまま無効にした状態では出ませんでした。

| 選択肢 | 選んだときの結果 |
| --- | --- |
| Yes, install | ユーザーアカウント用にプラグインを入れ、`restart to apply`と表示する。新しいセッションで言語サーバーが読み込まれる |
| No, not now | ダイアログを閉じ、後のセッションでまた提案される。**Esc**も同じ |
| Never for this plugin | このプラグインだけ提案しなくなり、ほかの言語のプラグインは引き続き提案される |
| Disable all LSP recommendations | すべての言語で提案しなくなる |

迷ったら、その言語でLSPを使いたいなら「Yes, install」、いまは要らないなら「No, not now」で十分です。30秒間どれも選ばないと無視したものとして数えられ、無視が5回たまると「Disable all LSP recommendations」を選んだのと同じ状態になります。提案を元に戻すには、Claude Code自身の設定ファイル`~/.claude.json`から`lspRecommendationDisabled`と`lspRecommendationIgnoredCount`のキーを消します。「Never for this plugin」を取り消すときは、同じファイルの`lspRecommendationNeverPlugins`のリストから`typescript-lsp@claude-plugins-official`のような該当IDを消します。

## `.lsp.json`で公式プラグインのない言語を追加する

対応表にない言語でも、言語サーバーさえあれば、`.lsp.json`を持つ小さなプラグインを作ってつなげます。注意したいのは、2026年11月2日の確認で`claude plugin validate`が`.lsp.json`の中身を見ていなかったことです。YAML用の設定で、知らないキー`extensions`を使ったもの、`command`に空白を入れたもの、拡張子のキーに点を付け忘れたものの3つの壊れた版を作っても、正しい版と同じく「Validation passed with warnings」で通りました。誤りが分かるのは読み込んだときだけです。

1. プラグイン用のフォルダを作り、`.claude-plugin/plugin.json`に名前を書きます。例は`{ "name": "yaml-lsp-local", "version": "0.1.0", "description": "yaml-language-server for .yaml/.yml" }`です。
2. 同じフォルダの直下に`.lsp.json`を置き、起動コマンドと拡張子を書きます。

   ```json
   {
     "yaml": {
       "command": "yaml-language-server",
       "args": ["--stdio"],
       "extensionToLanguage": { ".yaml": "yaml", ".yml": "yaml" }
     }
   }
   ```

3. `claude --debug --plugin-dir ./yaml-lsp-local`のように、`--plugin-dir`でそのセッションだけプラグインを読み込みます。ずっと使うならマーケットプレイスに置きます。
4. デバッグログに`Loaded 1 LSP server(s) from plugin: yaml-lsp-local`と出れば設定は読み込まれています。`LSP config validation failed for .lsp.json in plugin yaml-lsp-local`と`Unrecognized key: "extensions"`のような行が出たら、その言語サーバーは読み込まれていません。
5. YAMLのファイルをClaudeに編集させ、診断行が出るかを確かめます。言語サーバー本体（この例では`yaml-language-server`）は別にインストールしておきます。

[Claude Codeのプラグインリファレンス](https://code.claude.com/docs/en/plugins-reference#lspservers)によると、必須は`command`と`extensionToLanguage`の二つです。`command`には引数を含めず（`/`で始まる絶対パス以外は空白不可）、引数は`args`に書きます。`extensionToLanguage`のキーは`".go"`のように点から始めます。任意の項目には`env`、`initializationOptions`、`settings`、`workspaceFolder`、`startupTimeout`、`shutdownTimeout`、`requestTimeout`（既定60,000ミリ秒、v2.1.288以降）、`restartOnCrash`、`maxRestarts`、`diagnostics`などがあり、リストにないキーがあると設定全体が検証に失敗します。第三者が配っているLSPプラグイン集を入れる前に中身を確かめる方法は、[Claude Code modsとは：導入手順と、validateだけでは見えない権限](https://blog.laozhang.ai/ja/posts/claude-code-mods)で扱っています。

## 言語サーバーのメモリ使用量：重いときはプラグインを止める

言語サーバーはプロジェクトを索引する間メモリを使い、公式のトラブルシューティングは特に`rust-analyzer`と`pyright`がプロジェクト全体を索引すると説明しています。開発マシンが重くなるなら、そのセッションで`/plugin disable pyright-lsp@claude-plugins-official`のようにプラグインを無効にし、Claudeの組み込みの検索に任せるのが公式の案内です。止めても失うのは編集後の診断とシンボル検索だけで、Claudeはこれまでどおりgrepなどでコードを探します。

どのくらい使うかは言語とプロジェクトの大きさ次第です。目安として、Scott SpenceのSvelteKitプロジェクトでは`typescript-language-server`が約935MB（4プロセス）を使い、`findReferences`の節の`useSyntaxServer: "never"`を入れると約725MB（3プロセス）でした。LinuxとWSLで`CLAUDE_CODE_TOOL_MEMORY_LIMIT`によってツールのメモリに上限をかけている場合、言語サーバーもその上限の対象に数えられることがあり、v2.1.246以降は`CLAUDE_CODE_TOOL_MEMORY_CGROUP_EXCLUDE=lsp`で外せます。

## VS CodeでClaude Codeを使っていてもプラグインは必要か

VS Code拡張機能経由でClaude Codeを使っていても、編集のたびに自動で届く診断と`LSP`ツールが欲しいなら、プラグインと言語サーバーは必要です。[Claude CodeのVS Code向けドキュメント](https://code.claude.com/docs/en/vs-code)によると、VS Codeと連携したClaude Codeは`mcp__ide__getDiagnostics`（チャットパネルではv2.1.285以降`mcp__claude-vscode__getDiagnostics`）でVS Codeの「問題」パネルのエラーや警告を読めます。ただしこれはエディターの言語サーバーの結果を、Claudeが必要なときに読みに行く別の仕組みで、プラグインの診断のように編集後に自動で届くものでも、定義や参照をたどる`LSP`ツールでもありません。VS Code拡張機能では、プラグインはターミナルの`/plugin install`ではなく拡張機能のプラグイン画面から入れます。

## LSPを入れてもClaudeがgrepを使うとき：CLAUDE.mdにルールを書く

`LSP`ツールが使えるようになっても、Claudeがそれを使うとは限りません。Scott Spenceの2026年10月10日の検証では、CLAUDE.mdに「シンボルを探すときはLSPを使う」という明示的なルールを書くと、シンボルについての質問12回すべてでLSPが使われましたが、ルールを外すと使われたのは約半分で、リファクタリングでは3回中0回でした。一方、彼の実際の履歴では、LSPを入れた2月末から4月までの約650セッションのうち、LSPが呼ばれたのは15セッション、合計32回だけでした。

ただし、LSPを使えば常に良くなるわけではありません。Scott Spenceが「grepのみ」「LSPとgrep」「LSPのみ」を各3回、計54セッションで比べた結果では、grepの答えは正しく、`findReferences`はコードではなくファイル・行・列だけを返すため、LSPのみの実行では参照1件ごとに3〜6ファイルを読んでいました。`vi.mock`の文字列での参照や、`.ts`から`.svelte`への呼び出し元はLSPでは見つからず、LSPが優れていたのは`hover`による型の確認でした。彼はCLAUDE.mdを「定義や使用箇所はgrepで探す」「正確な型が必要なときはLSPの`hover`」「`findReferences`を完全な一覧とみなさない」「診断は編集の後のターンに届くので、完了を報告する前に型チェックを実行する」という内容に書き直しています。LSPをどの場面で使わせるかは、このようにCLAUDE.mdやスキルにルールとして書くのが確実です。ルールをどこに置くかは[Claude CodeのHooks・Skills・スラッシュコマンドを使い分ける：呼び出し方と設定例](https://blog.laozhang.ai/ja/posts/claude-code-hooks-slash-commands-skills)を参考にしてください。

## Claude Code LSPのよくある質問

### `claude -p`のスクリプト実行でもLSPは使われますか？

`--bare`を付けなければ使えます。2026年11月2日時点のClaude Codeのドキュメントでは、スクリプト向けの`claude -p`に`--bare`を付けるとLSPサーバーを起動しないとされています。Scott Spenceも`claude -p`のヘッドレス実行でLSPツールが呼ばれることを確かめており、CIなどで診断を使いたいなら`--bare`を外します。

### WindowsでもClaude CodeのLSPは使えますか？

使えます。Claude Codeの変更履歴によると、Windowsでファイルのパスが正しく渡らずLSPが動かない問題は2026年3月12日の2.1.74で修正されています。言語サーバーがPATHにあるかは、PowerShellの`Get-Command typescript-language-server`のように確かめ、C/C++なら`winget install LLVM.LLVM`のようにREADMEのWindows向けコマンドで入れます。

### LSPツールにも`Read`の拒否ルールは効きますか？

効きます。`LSP`ツールは読み取り専用で権限の確認なしに動きますが、`Read(~/secrets/**)`のような`Read`のパスのルールは`LSP`ツールにも適用されると[Claude Codeのツールリファレンス](https://code.claude.com/docs/en/tools-reference)に書かれています（2026年11月2日時点）。秘密ファイルを置いた場所は、`Read`の拒否ルールで指定しておけば`LSP`ツールからも対象外になります。

## 参考資料

本文で参照している外部ページを、登場順に並べています。最終更新日：2026-11-02。

- [Claude Codeの公式ドキュメント「コード インテリジェンス プラグイン」](https://code.claude.com/docs/ja/plugins/code-intelligence) (code.claude.com)
- [ツールリファレンスのLSPツールの説明](https://code.claude.com/docs/en/tools-reference) (code.claude.com)
- [Claude Codeの環境変数リファレンス](https://code.claude.com/docs/en/env-vars) (code.claude.com)
- [Claude Code LSPの解説記事](https://karanbansal.in/blog/claude-code-lsp/) (karanbansal.in)
- [「Revisiting LSP in Claude Code」](https://scottspence.com/posts/revisiting-lsp-in-claude-code) (scottspence.com)
- [Claude Codeのプラグインのトラブルシューティング](https://code.claude.com/docs/en/plugins/troubleshooting) (code.claude.com)
- [Claude Codeのプラグインリファレンス](https://code.claude.com/docs/en/plugins-reference) (code.claude.com)
- [Claude CodeのVS Code向けドキュメント](https://code.claude.com/docs/en/vs-code) (code.claude.com)
