はじめに
LSP のないコーディングエージェントにとって、コードはただのテキストです。grep と推測で型やシグネチャを組み立てるため、第三者ライブラリの定義を取り違えることがあります。LSP(Language Server Protocol)を使うと、エージェントはコードを「意味」として扱えるようになります。
GitHub Copilot CLI では、
.github/lsp.json
に LSP サーバーを設定すると、定義ジャンプや参照検索といったコード理解の機能が使えるようになります。この記事では、その設定方法と動作確認の手順をまとめます。
LSPとは
LSP(Language Server Protocol)は、エディタと言語サーバーの間の通信を定めたオープンな規格です。もともとは VS Code のために作られ、現在は多くのエディタやツールで使われています。
言語サーバーは、その言語に特化した機能を提供するプロセスです。たとえば TypeScript には
typescript-language-server
、Python には
pyright
があり、定義の検索や型情報の提供などを担います。
エディタと言語サーバーが分離していることで、ツールごとに言語対応を作り込む必要がなくなります。Copilot CLI もこの仕組みを利用して、言語サーバーを通じてコードを解析します。
LSPでできること
LSP サーバーを設定すると、Copilot CLI は次のような操作を、テキスト検索ではなく言語サーバー経由で行えるようになります。
- 定義へのジャンプ(関数やクラスがどこで定義されているか)
- 参照の検索(あるシンボルがどこで使われているか)
- ホバー(型情報やドキュメントの取得)
- リネーム(プロジェクト全体でのシンボル名の変更)
- 実装へのジャンプ、ファイル内のシンボル一覧、呼び出し関係の取得
これらは型情報にもとづくため、テキスト検索よりも正確です。ジェネリクスやオーバーロードのように、文字列の一致だけでは追いきれない情報も解決できます。結果が構造化されているぶん、やり取りするトークンも少なく済みます。
LSP サーバーが利用できる場合、Copilot CLI は自動的にそちらを使います。設定さえしておけば、こちらから明示的に指示する必要はありません。
言語サーバーのインストール
言語サーバーは、言語ごとに用意されたコマンドです。インストールの方法はいくつかあります。
もっとも手軽なのは、
lsp-setup
という skill を使う方法です。これは
github/awesome-copilot
リポジトリで公開されているコミュニティ製の skill で、言語をたずねたうえで、サーバーのインストールと設定ファイルの生成までを行います。
自分でインストールする場合は、グローバルに入れる方法があります。TypeScript の場合は次のようになります。
| 1 | npm install -g typescript typescript-language-server |
Python の場合は
pyright
を使います。
| 1 | npm install -g pyright |
グローバルインストールをせず、
npx
で都度実行することもできます。後述の設定でコマンドを
npx
にすると、
.github/lsp.json
をコミットしておくだけで、各メンバーは事前のインストールなしに利用できます。
設定ファイルの配置
Copilot CLI は、2つの場所から LSP の設定を読み込みます。
-
~/.copilot/lsp-config.json… ユーザー全体(すべてのプロジェクトに適用) -
.github/lsp.json… プロジェクト単位(リポジトリの利用者全員に適用)
プロジェクトで共有する場合は
.github/lsp.json
に置きます。
lsp-setup
skill は配置先の選択肢として「リポジトリのルートの
lsp.json
」も挙げますが、ルート直下に置いたところ読み込まれず、
.github/
に移すと動作しました。公式ドキュメントでも、プロジェクト単位の設定は
.github/lsp.json
と記載されています。
設定ファイルは次の構造になっています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { "lspServers": { "typescript": { "command": "npx", "args": ["typescript-language-server", "--stdio"], "fileExtensions": { ".ts": "typescript", ".tsx": "typescriptreact", ".js": "javascript", ".jsx": "javascriptreact" } } } } |
lspServers
の下に、サーバーごとの定義を置きます。
command
は起動するコマンド、
args
はその引数、
fileExtensions
は拡張子と言語 ID の対応です。サーバー名(ここでは
typescript
)には、英数字とアンダースコア、ハイフンが使えます。
上の例では
command
に
npx
を指定しています。これにより、
typescript-language-server
をグローバルにインストールしていなくても起動できます。ただし、初めて実行するときはパッケージのダウンロードが走るため、起動に時間がかかることがあります。あらかじめ一度
npx typescript-language-server --stdio
を実行してキャッシュしておくか、
args
の先頭に
-y
を加えておくと、対話的な確認で止まらずに済みます。
Python を追加する場合は、
lspServers
の下に並べて書きます。
| 1 2 3 4 5 6 7 8 9 10 11 | { "lspServers": { "python": { "command": "pyright-langserver", "args": ["--stdio"], "fileExtensions": { ".py": "python" } } } } |
上の TypeScript では
npx
を使いましたが、グローバルにインストールしてあれば、このようにコマンドを直接指定することもできます。
/lsp コマンドでの動作確認
設定したサーバーの状態は、
/lsp
コマンドで確認できます。
-
/lsp(または/lsp show)… 設定されているサーバーの一覧と状態 -
/lsp test <サーバー名>… サーバーが正しく起動するかのテスト -
/lsp reload… 設定ファイルの再読み込み
設定ファイルを変更したあとは、
/lsp reload
で再読み込みするか、
/exit
で Copilot CLI を終了して起動し直します。そのうえで
/lsp test typescript
を実行すると、サーバーが起動できるかを確認できます。起動に成功すると、その旨と PID が表示されます。
さいごに
.github/lsp.json
に LSP サーバーを設定することで、Copilot CLI が定義ジャンプや参照検索といったコード理解の機能を使えるようになりました。設定ファイルはリポジトリにコミットできるため、チーム全体で同じ設定を共有できます。
npx
を使えば、各メンバーが事前にサーバーをインストールする必要もありません。