mcpField
L
LSP MCP

LSP MCP

ローカル
github.com/jonrad開発ツール19282 週間前に更新

LSP MCP について

LSP MCP は、LSP(Language Server Protocol)の機能を LLM や AI エージェントに提供する MCP サーバーです。コードベースから言語を意識したコンテキストを取得できます。本プロジェクトは PoC の段階にあります。

主な機能

  1. 01LSP による言語を意識したコードコンテキスト
  2. 02複数の言語サーバーの同時利用
  3. 03JSON Schema から生成される LSP メソッド
  4. 04言語サーバーのオンデマンド起動

活用シーン

  1. 01AI アシスタントによる TypeScript コードの変数スコープ分析
  2. 02Claude Desktop から TypeScript 言語サーバーを利用

MCP 対応

本プロジェクトは MCP サーバーとして、言語サーバーの機能を MCP クライアントに公開し、AI が LSP を通じてコードの意味情報を取得できるようにします。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"lsp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/jonrad/lsp-mcp:0.3.1"
]
}
}
}
起動コマンドdocker run -i --rm docker.io/jonrad/lsp-mcp:0.3.1

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocidocker.io/jonrad/lsp-mcp:0.3.1

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

LSP MCP

LLM/AI エージェントに Language Server Protocol(LSP)サーバーの機能を提供する Model Context Protocol(MCP)サーバーです。これにより、AI はコードベースから言語を考慮したコンテキストを取得できます。

例

入力:

Use lsp to give me insights into the following typescript code:

let foo = "bar";
function x() {
  let foo = 123;
  console.log(foo);
}
x();
console.log(foo);

出力:

I'll use LSP (Language Server Protocol) to analyze your TypeScript code. Let me break down what's happening:
Here's what the code does and the insights from LSP analysis:

1. Variable Shadowing:

There are two variables named foo:

A global foo (string type) initialized with the value "bar"
A local foo (number type) inside the function x() initialized with the value 123

2. Execution Flow:

First, the global foo is declared and assigned the value "bar"
When function x() is called, the local foo variable is declared and assigned 123
The console.log(foo) inside the function outputs 123 (the local variable)
After the function finishes, console.log(foo) outputs "bar" (the global variable)

3. Scope Isolation:

The LSP confirms that TypeScript correctly identifies the different types:

The global foo is a string type
The local foo inside the function is a number type

Changes to the local foo don't affect the global foo

This is a classic example of variable shadowing in JavaScript/TypeScript, where a local variable with the same name as a global variable takes precedence within its scope.

警告

現在は POC の段階です。

機能

  • 複数の LSP を同時に使用できます(複数のプログラミング言語をサポート)。サンプル設定を参照してください。
  • LSP JSON Schema からサポート対象の LSP メソッドを動的に生成します。JSON Schemaを参照してください。

クイックスタート

Claude Desktop
Docker を使用する(推奨)

以下の内容を claude_desktop_config.json に追加します(MCP Docsの説明を参照してください)。

{
  "mcpServers": {
    "lsp": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "docker.io/jonrad/lsp-mcp:0.3.1"]
    }
  }
}

docker に -v /local_dir:/remote_dir を渡して、いくつかのファイルをコンテナと共有するとよいでしょう。これで、/remote_dir/<filename> にあるファイルについて Claude に質問できます。

npx を使用する

注:Claude Desktop は npx の動作が不安定なようです。MCP が失敗したと表示されても、ツールは動作する場合があります。この件は……また後で調べます 😊

{
  "mcpServers": {
    "lsp": {
      "command": "npx",
      "args": ["-y", "--silent", "git+https://github.com/jonrad/lsp-mcp", "--lsp", "npx -y --silent -p '[email protected]' -p '[email protected]' typescript-language-server --stdio"]
    }
  }
}

これにより、Claude は TypeScript 言語サーバーの LSP 機能を利用できるようになります。--lsp 引数を変更して言語サーバーを切り替えられます(その後、Claude を再起動してください)。

複数の LSP を同時に使用する機能は、まだサポートされていません。

Cursor

Cursor が提供する手順に従ってください。設定では、上記の Claude の例のように、Type = command、Command = docker run ... を選択します(例:docker run -i --rm -v <LOCAL_DIR>:<REMOTE_DIR> jonrad/lsp-mcp:<version>)。

MCP CLI クライアント

Claude の手順に従いますが、設定ファイルは ~/.llm/config.json にあります。

基本事項(概要)

MCP とは?
  • MCP - ドキュメント
  • MCP Python SDK - MCP サーバー用 Python ライブラリ
LSP とは?
  • LSP - ドキュメント
  • multilspy - LSP 用 Python クライアントライブラリ

開発

yarn
yarn mcp-cli # Interactive MCP tool to help with development
yarn dev --help # Get the CLI help
依存関係
決定事項
  • Python を使用する — 起動を簡単にしてくれるクライアントライブラリを活用したいと考えています。多くの LSP は Node で作られていますが、成熟したクライアントライブラリは VS Code に依存しているようです。multilspy がよさそうなので、まずは Python から始めます。すでに Python の MCP を作成していることもあり、少なくともその点では先行できます。
  • パッケージ管理などに uv を使用する — 最近、これが使われるのをよく見かけるようになり、学ぶよい機会になります。将来パッケージマネージャーを切り替えるのは面倒ですが、可能です。CI/CD を実装する段階で、この決定を見直す必要があるかもしれません。taskfile への依存の代わりに使えるでしょうか?検討中です。
  • 可能な限り非同期にします — 2025 年ですから。
  • 結局、Node に切り替えます。Python での POC は予想以上にうまくいきました。しかし、multilspy は LSP 仕様全体をサポートしておらず、LSP サーバー/クライアントで事実上の標準言語とも言える Node を使うほうが、VS Code のライブラリを扱いやすいでしょう。
  • 低レベルの MCP SDK を使用します。より多くの制御が必要になると思いますし、正直なところ、高レベルの FastMCP と比べてもそれほど複雑ではありません。
  • 設定の検証には zod を使用します。すでに MCP SDK の依存関係になっているので、あれこれ考える必要はありません。
  • 未知の言語であっても、常に LSP を使用することにしました(たとえば、LLM が Python の textDocument/documentSymbol リクエストを送るものの、Python の LSP が登録されていない場合など)。この決定はおそらく見直すことになります。
  • LSP は、何かを求められたときにのみ起動することにしました。後から設定可能にするかもしれませんが、現時点ではこれによりリソースの過剰な使用を防げます。
ロードマップ

これは、いずれ取り組みたいことの一覧です。予定時期や順序は決まっていません。

  • LSP クライアント(このプロジェクト)と LSP サーバーの間で、ケイパビリティを同期する方法を見つける
  • LSP JSON Schema を自動生成するか、公開場所を見つける
  • JSON Schema を CLI 引数にして、新しいスキーマをサポートするためのコードを更新せずに済むようにする
  • すでに実行中の LSP サーバーに接続する(多重化 LSP サーバー経由?)
  • (Taskfile)[https://taskfile.dev/] に切り替える
  • 適切なリリースプロセスを作成する

参考資料

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。