Claude Code から LSP を直接使える MCP を(Claude Codeで)作ってみた

に公開

TL;DR

とりあえず使ってみたい人向け
https://github.com/ktnyt/cclsp
https://www.npmjs.com/package/cclsp
https://asciinema.org/a/njOXqflftQBcvPhAkH6gLvVXY

モチベ

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