Claude Code から LSP を直接使える MCP を(Claude Codeで)作ってみた
TL;DR
とりあえず使ってみたい人向け
モチベ
Claude Codeにコードを書かせているとコードの調査のために結構な頻度で過剰にトークンを消費するパターン検索をします。可能な限り /compact
を走らせたくないが必要十分な実装を調査してほしい、そんなときにLSPを使えたら便利なのになあというのが出発点でした。人間でもコード検索を使うよりもエディタのLSP統合を使ったほうがコード読みがスムーズなのでそこに着想を得ています。
実装
完全にClaude Codeに任せました。bunのセットアップからlinter/formatter設定、クライアントの開発、テストの実装まで手放しでやってくれました。事前に縛ったのは「設定ファイルのスキーマ」と「MCP設定ファイルの書き方」くらいでした。MCP/LSPともにSDKが充実していたおかげであっという間に完成しました。
使い方
まずClaude CodeにMCP設定を追加します。NPMに cclsp
という名前で公開してあるのでそちらを npm install -g cclsp
でインストールするでも npx
を使って呼び出すでもOKです。ローカルにクローンして bun
を使ったり bun run build
して直接 index.js
を実行するもよしです。
{
"mcpServers": {
...
"cclsp": {
"command": "npx",
"args": ["cclsp"],
"env": {
"CCLSP_CONFIG_PATH": "/Users/nano/.config/claude/cclsp.json"
}
}
}
}
LSPの設定ファイルはMCPの設定ファイルに似せてあります。認識してほしい拡張子のリストとコマンドを設定するとあとはよしなにやってくれます。当然ですがローカルに該当LSPがインストールされていてClaude Code実行時にコマンドが認識できる必要があるのでその点だけご注意ください。
{
"servers": [
{
"extensions": ["js", "ts", "jsx", "tsx", "mjs", "cjs"],
"command": ["npx", "--", "typescript-language-server", "--stdio"],
"rootDir": "."
},
{
"extensions": ["py", "pyi"],
"command": ["uvx", "--from", "python-lsp-server", "pylsp"],
"rootDir": "."
}
]
}
実際コンテキスト圧縮できたの?
体感ではパターン検索の使用頻度は減ってる気がします。Claude Codeが不安になって(?)網羅的に検索をかけることはありますが人間でもそういうことはありますし(特にリファクタリングやテスト追加時)そこはプロンプトで制限をかけたりとやりようはあります。
この言語/メソッド/LSP対応して
要望ベースでできる限り応えるつもりなのでIssueをたてるなりTwitterでリプするなりでお申し付けください(実装を確約するものではないです)。PRも大歓迎なのでぜひ。Claude Codeでだいたい解決するのでPRチャンスですよ、LAPRASスコアも上がりますよ(回し者)。
Discussion