📝

GitHub Copilot CLI に Language Server Protocol (LSP) Server を追加してみた

に公開

はじめに

最近は、ずっと GitHub Copilot CLI をメインで使っているのですが、恥ずかしながら LSP サーバーを追加出来ることを知らずに使っていました。LSP サーバーを追加することで GitHub Copilot CLI が、プログラムのコードから特定のクラスやメソッドを探す際に文字列検索ではなく LSP サーバーを使ってコード構造を理解して検索するようになるため、より正確な検索結果が得られるようになります。

これによってテキスト検索のせいで発生する無駄な検索結果が減って AI にとってもコンテキストの汚染を少なくすることが出来るようになります。

追加方法

GitHub Copilot CLI の個人的に素晴らしいと思っている点の 1 つとして、自分自身のドキュメントを検索して自分自身の使い方を教えてくれる点があります。LSP サーバーの追加方法も GitHub Copilot CLI に質問してお願いすることで設定が完了しました。

以下がやり取りの流れです。

ステップ 1:設定方法を聞く

🧑 人間: GitHub Copilot CLI で C# の LSP を設定する方法を教えて

🤖 AI: Copilot CLI のドキュメントを調べた上で、以下の手順を提示しました。

  1. C# 用の LSP サーバー csharp-ls をインストールする
  2. LSP 設定ファイル(~/.copilot/lsp-config.json または .github/lsp.json)を作成する
  3. /lsp コマンドで状態を確認する

GitHub Copilot CLI が良い感じにドキュメントを調べて設定方法を教えてくれました。


ステップ 2:インストールを実行する

🧑 人間: インストールコマンドを実行して

🤖 AI: 以下のコマンドを実行しました。

dotnet tool install --global csharp-ls

結果: csharp-ls v0.22.0 が正常にインストールされました。

その後「LSP 設定ファイルも作成しますか?」と確認を取りました。

私はメインで C# を使っているので C# の LSP サーバーをインストールしてもらいました。普段は VS 2026 とか VS Code を使っているので自分で LSP サーバーをインストールすることは無かったのですが、こんなに簡単に入れられるんですね。


ステップ 3:設定ファイルを作成する

🧑 人間: グローバルの設定ファイルに追加して

🤖 AI: 以下の手順で設定ファイルを作成しました。

  1. ~/.copilot/lsp-config.json が存在しないことを確認
  2. ~/.copilot/ ディレクトリの存在を確認
  3. 設定ファイルを作成:
{
  "lspServers": {
    "csharp": {
      "command": "csharp-ls",
      "args": [],
      "fileExtensions": {
        ".cs": "csharp"
      }
    }
  }
}

今回は、全体で設定を有効化したかったのでグローバルの設定ファイルに追加してもらいました。プロジェクトごとに設定を分けたい場合は、プロジェクトルートに .github/lsp.json を作成して同様の内容を記載すれば OK です。というか、自分で 1 行も設定ファイル書いてない…。

使ってみよう

ということで GitHub Copilot CLI が自分で設定をしてくれたので適当なリポジトリを開いて動作確認をしてみました。今回は ReactiveProperty のリポジトリのフォルダーで試してみました。

❯ ReactiveProperty クラスを探して


● Language Server: Search workspace for "ReactiveProperty"
  └ Found 49 symbol(s) matching "ReactiveProperty" (searched: csharp):

● ReactiveProperty クラスの主要な定義は以下のファイルにあります:

  メインクラス:

  ┌─────────────────────────────────┬─────────────────────────────────────────────────────────────┐
  │ クラス                          │ ファイル                                                    │
  ├─────────────────────────────────┼─────────────────────────────────────────────────────────────┤
  │ ReactiveProperty<T> (class)     │ Source\ReactiveProperty.NETStandard\ReactiveProperty.cs:20  │
  ├─────────────────────────────────┼─────────────────────────────────────────────────────────────┤
  │ ReactiveProperty (static class) │ Source\ReactiveProperty.NETStandard\ReactiveProperty.cs:453 │
  └─────────────────────────────────┴─────────────────────────────────────────────────────────────┘

  Slim バリアント (Core):

  ┌─────────────────────────────────┬────────────────────────────────────────────────────────────────┐
  │ クラス                          │ ファイル                                                       │
  ├─────────────────────────────────┼────────────────────────────────────────────────────────────────┤
  │ ReactivePropertySlim<T>         │ Source\ReactiveProperty.Core\ReactivePropertySlim.cs:15        │
  ├─────────────────────────────────┼────────────────────────────────────────────────────────────────┤
  │ ReadOnlyReactivePropertySlim<T> │ Source\ReactiveProperty.Core\ReactivePropertySlim.cs:263       │
  ├─────────────────────────────────┼────────────────────────────────────────────────────────────────┤
  │ ValidatableReactiveProperty<T>  │ Source\ReactiveProperty.Core\ValidatableReactiveProperty.cs:37 │
  └─────────────────────────────────┴────────────────────────────────────────────────────────────────┘

  インターフェース:

  ┌──────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────┐
  │ インターフェース                                         │ ファイル                                                  │
  ├──────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤
  │ IReactiveProperty / IReactiveProperty<T>                 │ Source\ReactiveProperty.Core\IReactiveProperty.cs         │
  ├──────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────┤
  │ IReadOnlyReactiveProperty / IReadOnlyReactiveProperty<T> │ Source\ReactiveProperty.Core\IReadOnlyReactiveProperty.cs │
  └──────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────┘

  その他:

  ┌─────────────────────────────┬────────────────────────────────────────────────────────────────────┐
  │ クラス                      │ ファイル                                                           │
  ├─────────────────────────────┼────────────────────────────────────────────────────────────────────┤
  │ ReadOnlyReactiveProperty<T> │ Source\ReactiveProperty.NETStandard\ReadOnlyReactiveProperty.cs:16 │
  ├─────────────────────────────┼────────────────────────────────────────────────────────────────────┤
  │ ReactivePropertyMode (enum) │ Source\ReactiveProperty.Core\ReactivePropertyMode.cs:9             │
  └─────────────────────────────┴────────────────────────────────────────────────────────────────────┘

  メインの ReactiveProperty<T> クラスを確認しますか?

良い感じですね。色々試した結果、参照やホバーといったような情報は上手く取れないのですが、シンボル検索ができるだけでも便利に使えそうです。ここらへんは今回使用した LSP サーバーと GitHub Copilot CLI の相性の問題っぽいので時間が解決すると思っています。

まとめ

ということで LSP サーバーを追加してみました。まだ、C# の LSP サーバーが完全に動くわけではないですが将来的には良い感じに動くようになることを期待して待ちたいと思います。

Microsoft (有志)

Discussion