LSP MCP Server について
LSP MCP Server は、MCP クライアントと Language Server Protocol サーバーをつなぎ、言語に応じたコード情報を提供します。ツールとリソースを通じて、ホバー情報、補完候補、診断結果、コードアクションを利用できます。
主な機能
- 01コード位置のホバー情報を取得
- 02補完候補を取得
- 03診断結果とコードアクションを取得
- 04解析対象のドキュメントを開閉
- 05LSP サーバーの再起動と設定
- 06診断リソースによる更新の取得
活用シーン
- 01ソースファイル内のシンボルや型情報を確認する
- 02指定したカーソル位置で補完候補を求める
- 03開いているファイルのエラーや警告を確認する
- 04選択範囲に対するコードアクションを取得する
MCP 対応
このサーバーは LSP サーバーを起動して接続し、その機能を MCP ツールとリソースとして公開します。診断リソースは更新のサブスクリプションに対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
LSP MCP サーバー
LSP (Language Server Protocol) インターフェースと対話するための MCP (Model Context Protocol) サーバーです。 このサーバーは、LLM が LSP の Hover プロバイダーや Completion プロバイダーに問い合わせることを可能にするブリッジとして機能します。
概要
MCP サーバーは次のように動作します:
- LSP サーバーに接続する LSP クライアントを起動します
- LSP サーバーにリクエストを送信する MCP ツールを公開します
- LLM が理解して利用できる形式で結果を返します
これにより、LLM は LSP を活用してより正確なコード提案を得ることができます。
設定:
{
"mcpServers": {
"lsp-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"tritlo/lsp-mcp",
"<language-id>",
"<path-to-lsp>",
"<lsp-args>"
]
}
}
}
機能
MCP ツール
get_info_on_location: ファイル内の特定の位置のホバー情報を取得しますget_completions: ファイル内の特定の位置の補完候補を取得しますget_code_actions: ファイル内の特定の範囲のコードアクションを取得しますopen_document: 解析のために LSP サーバーでファイルを開きますclose_document: LSP サーバーでファイルを閉じますget_diagnostics: 開いているファイルの診断メッセージ(エラー、警告)を取得しますstart_lsp: 指定したルートディレクトリで LSP サーバーを起動しますrestart_lsp_server: MCP サーバーを再起動せずに LSP サーバーを再起動しますset_log_level: 実行時にサーバーのログ詳細レベルを変更します
MCP リソース
lsp-diagnostics://リソース:サブスクリプションによるリアルタイム更新を伴う診断メッセージにアクセスするためのリソースlsp-hover://リソース:特定のファイル位置のホバー情報を取得するためのリソースlsp-completions://リソース:特定の位置のコード補完候補を取得するためのリソース
追加機能
- 複数の重大度レベルを備えた包括的なログシステム
- 可読性を高めるための色付きコンソール出力
- 実行時に設定可能なログレベル
- 詳細なエラー処理とレポート
- シンプルなコマンドラインインターフェース
前提条件
- Node.js (v16 以降)
- npm
デモサーバーの場合:
- GHC (8.10 以降)
- Cabal (3.0 以降)
インストール
MCP サーバーのビルド
-
このリポジトリをクローンします:
git clone https://github.com/your-username/lsp-mcp.git cd lsp-mcp -
依存関係をインストールします:
npm install -
MCP サーバーをビルドします:
npm run build
テスト
このプロジェクトには、TypeScript LSP サポートの統合テストが含まれています。これらのテストは、LSP-MCP サーバーがホバー情報、補完、診断、コードアクションなどの LSP 操作を正しく処理することを検証します。
テストの実行
TypeScript LSP テストを実行するには:
npm test
または具体的には:
npm run test:typescript
テストカバレッジ
テストは以下の機能を検証します:
- モックプロジェクトを使用した TypeScript LSP の初期化
- 解析のための TypeScript ファイルのオープン
- 関数と型のホバー情報の取得
- コード補完候補の取得
- 診断エラーメッセージの取得
- エラーに対するコードアクションの取得
テストプロジェクトは test/ts-project/ にあり、診断フィードバックをテストするための意図的なエラーを含む TypeScript ファイルが含まれています。
使用方法
LSP 実行ファイルへのパスと、LSP サーバーに渡す引数を指定して MCP サーバーを実行します:
npx tritlo/lsp-mcp <language> /path/to/lsp [lsp-args...]
例えば:
npx tritlo/lsp-mcp haskell /usr/bin/haskell-language-server-wrapper lsp
重要:LSP サーバーの起動
バージョン 0.2.0 以降では、LSP 機能を使用する前に start_lsp ツールを呼び出して LSP サーバーを明示的に起動する必要があります。これにより、正しいルートディレクトリで適切に初期化されることが保証され、npx などのツールを使用する場合に特に重要です:
{
"tool": "start_lsp",
"arguments": {
"root_dir": "/path/to/your/project"
}
}
ログ
サーバーには 8 つの重大度レベルを備えた包括的なログシステムが含まれています:
debug: デバッグ目的の詳細情報info: システム動作に関する一般的な情報メッセージnotice: 重要な運用イベントwarning: 注意が必要となる可能性のある潜在的な問題error: 動作に影響を与えるがシステムを停止させないエラー状態critical: 即時の対応が必要な重大な状態alert: システムが不安定な状態emergency: システムが使用不能な状態
デフォルトでは、ログは次の場所に送信されます:
- 可読性を高めるための色分けされたコンソール出力
- クライアントへの MCP 通知(
notifications/messageメソッド経由)
デバッグログの表示
詳細なデバッグを行うには、次の方法があります。
-
Claude の実行時に
claude --mcp-debugフラグを使用すると、Claude とサーバー間のすべての MCP トラフィックを確認できます。claude --mcp-debug -
set_log_levelツールを使用して、実行時にログレベルを変更します。{ "tool": "set_log_level", "arguments": { "level": "debug" } }
デフォルトのログレベルは info で、冗長なデバッグメッセージを除外しつつ、適度な運用上の詳細を表示します。
API
サーバーは以下の MCP ツールを提供します。
get_info_on_location
ファイル内の特定の位置にあるホバー情報を取得します。
パラメータ:
file_path: ファイルのパスlanguage_id: ファイルが書かれているプログラミング言語(例: "haskell")line: 行番号column: 列位置
例:
{
"tool": "get_info_on_location",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell",
"line": 3,
"column": 5
}
}
get_completions
ファイル内の特定の位置にある補完候補を取得します。
パラメータ:
file_path: ファイルのパスlanguage_id: ファイルが書かれているプログラミング言語(例: "haskell")line: 行番号column: 列位置
例:
{
"tool": "get_completions",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell",
"line": 3,
"column": 10
}
}
get_code_actions
ファイル内の特定の範囲に対するコードアクションを取得します。
パラメータ:
file_path: ファイルのパスlanguage_id: ファイルが書かれているプログラミング言語(例: "haskell")start_line: 開始行番号start_column: 開始列位置end_line: 終了行番号end_column: 終了列位置
例:
{
"tool": "get_code_actions",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell",
"start_line": 3,
"start_column": 5,
"end_line": 3,
"end_column": 10
}
}
start_lsp
指定したルートディレクトリで LSP サーバーを起動します。これは、他の LSP 関連ツールを使用する前に呼び出す必要があります。
パラメータ:
root_dir: LSP サーバーのルートディレクトリ(絶対パスを推奨)
例:
{
"tool": "start_lsp",
"arguments": {
"root_dir": "/path/to/your/project"
}
}
restart_lsp_server
MCP サーバーを再起動せずに、LSP サーバープロセスを再起動します。これは、LSP サーバーの問題からの復旧や、LSP サーバー設定への変更の適用に役立ちます。
パラメータ:
root_dir: (省略可能) LSP サーバーのルートディレクトリ。指定した場合、再起動後にサーバーはこのディレクトリで初期化されます。
root_dir を指定しない例(以前に設定されたルートディレクトリを使用):
{
"tool": "restart_lsp_server",
"arguments": {}
}
root_dir を指定する例:
{
"tool": "restart_lsp_server",
"arguments": {
"root_dir": "/path/to/your/project"
}
}
open_document
解析のために LSP サーバーでファイルを開きます。これは、診断情報にアクセスしたり、そのファイルに対して他の操作を実行したりする前に呼び出す必要があります。
パラメータ:
file_path: 開くファイルのパスlanguage_id: ファイルが書かれているプログラミング言語(例: "haskell")
例:
{
"tool": "open_document",
"arguments": {
"file_path": "/path/to/your/file",
"language_id": "haskell"
}
}
close_document
ファイルの操作が完了したら、LSP サーバーでそのファイルを閉じます。これはリソースの管理とクリーンアップに役立ちます。
パラメータ:
file_path: 閉じるファイルのパス
例:
{
"tool": "close_document",
"arguments": {
"file_path": "/path/to/your/file"
}
}
get_diagnostics
1 つまたはすべての開いているファイルの診断メッセージ(エラー、警告)を取得します。
パラメータ:
file_path: (省略可能) 診断情報を取得するファイルのパス。指定しない場合、開いているすべてのファイルの診断情報を返します。
特定のファイルの例:
{
"tool": "get_diagnostics",
"arguments": {
"file_path": "/path/to/your/file"
}
}
開いているすべてのファイルの例:
{
"tool": "get_diagnostics",
"arguments": {}
}
set_log_level
サーバーのログレベルを設定して、ログメッセージの詳細度を制御します。
パラメータ:
level: 設定するログレベル。debug、info、notice、warning、error、critical、alert、emergencyのいずれか。
例:
{
"tool": "set_log_level",
"arguments": {
"level": "debug"
}
}
MCP リソース
ツールに加えて、サーバーは診断情報、ホバー情報、コード補完などの LSP 機能にアクセスするためのリソースを提供します。
診断リソース
サーバーは lsp-diagnostics:// リソーススキームを介して診断情報を公開します。これらのリソースを購読すると、診断情報が変更されたときにリアルタイムで更新を受け取ることができます。
リソース URI:
lsp-diagnostics://- 開いているすべてのファイルの診断情報lsp-diagnostics:///path/to/file- 特定のファイルの診断情報
重要: 診断情報にアクセスする前に、open_document ツールを使用してファイルを開く必要があります。
ホバー情報リソース
サーバーは lsp-hover:// リソーススキームを通じてホバー情報を公開します。これにより、ファイル内の特定の位置にあるコード要素に関する情報を取得できます。
リソース URI の形式:
lsp-hover:///path/to/file?line={line}&column={column}&language_id={language_id}
パラメータ:
line: 行番号 (1 始まり)column: 列位置 (1 始まり)language_id: プログラミング言語 (例: "haskell")
例:
lsp-hover:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell
コード補完リソース
サーバーは lsp-completions:// リソーススキームを通じてコード補完の候補を公開します。これにより、ファイル内の特定の位置にある補完候補を取得できます。
リソース URI の形式:
lsp-completions:///path/to/file?line={line}&column={column}&language_id={language_id}
パラメータ:
line: 行番号 (1 始まり)column: 列位置 (1 始まり)language_id: プログラミング言語 (例: "haskell")
例:
lsp-completions:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell
利用可能なリソースの一覧表示
利用可能なリソースを確認するには、MCP の resources/list エンドポイントを使用します。レスポンスには、現在開いているファイルで利用可能なすべてのリソースが含まれます:
- 開いているすべてのファイルの診断リソース
- 開いているすべてのファイルのホバー情報テンプレート
- 開いているすべてのファイルのコード補完テンプレート
リソース更新の購読
診断リソースは、診断が変更されたとき (例: ファイルが変更され、新しいエラーや警告が表示されたとき) にリアルタイムの更新を受け取るための購読をサポートしています。診断リソースを購読するには、MCP の resources/subscribe エンドポイントを使用します。
注: ホバーリソースと補完リソースは、特定時点のクエリを表すため、購読をサポートしていません。
リソースとツールの使い分け
LSP の機能にアクセスするには、2 つのアプローチから選択できます:
- ツールベースのアプローチ:
get_diagnostics、get_info_on_location、get_completionsツールを使用すると、シンプルかつ直接的に情報を取得できます。 - リソースベースのアプローチ:
lsp-diagnostics://、lsp-hover://、lsp-completions://リソースを使用すると、より RESTful なアプローチで情報を取得できます。
どちらのアプローチも、同じデータを同じ形式で提供し、ファイルを先に開く必要があるという同じ要件を課します。
トラブルシューティング
- サーバーの起動に失敗する場合は、LSP 実行ファイルへのパスが正しいことを確認してください
- 詳細なエラーメッセージについては、ログファイル (設定されている場合) を確認してください
ライセンス
MIT ライセンス
拡張機能
LSP-MCP サーバーは、さまざまなプログラミング言語向けに機能を強化する言語固有の拡張機能をサポートしています。拡張機能は以下を提供できます:
- カスタムの LSP 固有のツールと機能
- 言語固有のリソースハンドラーとテンプレート
- 言語関連のタスク向けの専用プロンプト
- リアルタイムデータ用のカスタム購読ハンドラー
利用可能な拡張機能
現在、以下の拡張機能が利用可能です:
- Haskell: Haskell 開発向けの専用プロンプトを提供します。型付きホール (typed-hole) の探索ガイダンスなどが含まれます
拡張機能の使用
拡張機能は、サーバー起動時に言語 ID を指定すると自動的に読み込まれます:
npx tritlo/lsp-mcp haskell /path/to/haskell-language-server-wrapper lsp
拡張機能の名前空間
拡張機能が提供するすべての機能には、言語 ID の名前空間が付けられます。たとえば、Haskell 拡張機能の型付きホールプロンプトは haskell.typed-hole-use として利用できます。
新しい拡張機能の作成
新しい拡張機能を作成するには:
-
src/extensions/に、言語名の TypeScript ファイル(例:typescript.ts)を新規作成します -
以下のオプション関数のいずれかを備えた Extension インターフェースを実装します:
getToolHandlers(): カスタムツールの実装を提供しますgetToolDefinitions(): MCP API でカスタムツールを定義しますgetResourceHandlers(): カスタムリソースハンドラーを実装しますgetSubscriptionHandlers(): カスタムサブスクリプションハンドラーを実装しますgetUnsubscriptionHandlers(): カスタムアンサブスクリプションハンドラーを実装しますgetResourceTemplates(): カスタムリソーステンプレートを定義しますgetPromptDefinitions(): 言語タスク用のカスタムプロンプトを定義しますgetPromptHandlers(): カスタムプロンプトハンドラーを実装します
-
実装した関数をエクスポートします
拡張機能システムは、一致する言語 ID が指定されると、拡張機能を自動的に読み込みます。
謝辞
- Language Server Protocol の実装を提供してくれた HLS チーム
- Model Context Protocol の仕様を提供してくれた Anthropic
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。