LSP MCP Server

by Tritlo
Verified

local-only server

The server can only run on the client’s local machine because it depends on local resources.

Integrations

  • Provides specialized prompts for Haskell development, including typed-hole exploration guidance when working with the Haskell Language Server.

  • Supports integration with Node.js projects, allowing language models to access language server features for JavaScript and TypeScript codebases.

  • Enables interaction with TypeScript language servers to provide hover information, code completions, diagnostics, and code actions for TypeScript projects.

LSP MCP サーバー

LSP(言語サーバープロトコル)インターフェースと連携するためのMCP(モデルコンテキストプロトコル)サーバー。このサーバーは、LLMがLSPホバープロバイダーおよび補完プロバイダーにクエリを実行できるようにするブリッジとして機能します。

概要

MCP サーバーは次のように動作します。

  1. LSPサーバーに接続するLSPクライアントの起動
  2. LSP サーバーにリクエストを送信する MCP ツールを公開する
  3. 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サーバーの構築

  1. このリポジトリをクローンします:
    git clone https://github.com/your-username/lsp-mcp.git cd lsp-mcp
  2. 依存関係をインストールします:
    npm install
  3. 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 :システムは使用不可です

デフォルトでは、ログは次の場所に送信されます。

  1. 読みやすさを向上させるために色分けされたコンソール出力
  2. クライアントへの MCP 通知 ( notifications/messageメソッド経由)

デバッグログの表示

詳細なデバッグを行うには、次の操作を実行できます。

  1. Claude を実行するときにclaude --mcp-debugフラグを使用して、Claude とサーバー間のすべての MCP トラフィックを表示します。
    claude --mcp-debug
  2. set_log_levelツールを使用して実行時にログ レベルを変更します。
    { "tool": "set_log_level", "arguments": { "level": "debug" } }

デフォルトのログ レベルはinfoで、詳細なデバッグ メッセージを除外しながら、中程度の操作詳細を表示します。

API

サーバーは次の MCP ツールを提供します。

位置情報を取得する

ファイル内の特定の場所のホバー情報を取得します。

パラメータ:

  • 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_completeions

ファイル内の特定の場所にある補完候補を取得します。

パラメータ:

  • 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 } }

開始_lsp

指定されたルートディレクトリでLSPサーバーを起動します。他のLSP関連ツールを使用する前に、この関数を呼び出す必要があります。

パラメータ:

  • root_dir : LSPサーバーのルートディレクトリ(絶対パスを推奨)

例:

{ "tool": "start_lsp", "arguments": { "root_dir": "/path/to/your/project" } }

再起動lspサーバー

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" } }

ドキュメントを開く

LSPサーバー内のファイルを分析用に開きます。診断情報にアクセスしたり、ファイルに対して他の操作を実行したりする前に、この関数を呼び出す必要があります。

パラメータ:

  • file_path : 開くファイルへのパス
  • language_id : ファイルが記述されているプログラミング言語(例:"haskell")

例:

{ "tool": "open_document", "arguments": { "file_path": "/path/to/your/file", "language_id": "haskell" } }

ドキュメントを閉じる

作業が完了したら、LSPサーバー内のファイルを閉じます。これにより、リソース管理とクリーンアップが容易になります。

パラメータ:

  • file_path : 閉じるファイルへのパス

例:

{ "tool": "close_document", "arguments": { "file_path": "/path/to/your/file" } }

診断情報を取得する

開いている 1 つまたはすべてのファイルの診断メッセージ (エラー、警告) を取得します。

パラメータ:

  • file_path : (オプション) 診断情報を取得するファイルへのパス。指定しない場合は、開いているすべてのファイルの診断情報を返します。

特定のファイルの例:

{ "tool": "get_diagnostics", "arguments": { "file_path": "/path/to/your/file" } }

開いているすべてのファイルの例:

{ "tool": "get_diagnostics", "arguments": {} }

ログレベル設定

ログ メッセージの詳細度を制御するためにサーバーのログ レベルを設定します。

パラメータ:

  • level : 設定するログレベル。debug、 infonoticewarningerrorcriticalalertemergencyのいずれかにdebugます。

例:

{ "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 つの方法から選択できます。

  1. ツールベースのアプローチ: get_diagnosticsget_info_on_location 、およびget_completionsツールを使用して、シンプルかつ直接的に情報を取得します。
  2. リソースベースのアプローチ: より RESTful なアプローチを実現するにはlsp-diagnostics://lsp-hover:// 、およびlsp-completions://リソースを使用します。

どちらのアプローチも同じ形式で同じデータを提供し、最初にファイルを開く必要があるという同じ要件を適用します。

トラブルシューティング

  • サーバーの起動に失敗した場合は、LSP実行ファイルへのパスが正しいことを確認してください。
  • 詳細なエラーメッセージについては、ログファイル(設定されている場合)を確認してください。

ライセンス

MITライセンス

拡張機能

LSP-MCPサーバーは、さまざまなプログラミング言語に対応する機能を強化する言語固有の拡張機能をサポートしています。拡張機能により、以下の機能が提供されます。

  • LSP固有のカスタムツールと機能
  • 言語固有のリソースハンドラーとテンプレート
  • 言語関連のタスクに特化したプロンプト
  • リアルタイムデータ用のカスタムサブスクリプションハンドラー

利用可能な拡張機能

現在、次の拡張機能が利用可能です。

  • Haskell :型付きホール探索ガイダンスを含む、Haskell開発のための特別なプロンプトを提供します。

拡張機能の使用

サーバーの起動時に言語 ID を指定すると、拡張機能は自動的に読み込まれます。

npx tritlo/lsp-mcp haskell /path/to/haskell-language-server-wrapper lsp

拡張機能の名前空間

拡張機能が提供するすべての機能は、言語IDで名前空間化されます。例えば、Haskell拡張機能の typed-hole プロンプトはhaskell.typed-hole-useとして利用できます。

新しい拡張機能の作成

新しい拡張機能を作成するには:

  1. src/extensions/に、言語名を冠した新しい TypeScript ファイルを作成します (例: typescript.ts )
  2. 次のいずれかのオプション関数を使用して Extension インターフェイスを実装します。
    • getToolHandlers() : カスタムツール実装を提供する
    • getToolDefinitions() : MCP API でカスタムツールを定義する
    • getResourceHandlers() : カスタムリソースハンドラーを実装する
    • getSubscriptionHandlers() : カスタムサブスクリプションハンドラーを実装する
    • getUnsubscriptionHandlers() : カスタムの購読解除ハンドラーを実装する
    • getResourceTemplates() : カスタムリソーステンプレートを定義する
    • getPromptDefinitions() : 言語タスクのカスタムプロンプトを定義する
    • getPromptHandlers() : カスタムプロンプトハンドラーを実装する
  3. 実装関数をエクスポートする

一致する言語 ID が指定されると、拡張機能システムは拡張機能を自動的に読み込みます。

謝辞

  • 言語サーバープロトコル実装のHLSチーム
  • モデルコンテキストプロトコル仕様のAnthropic
ID: 075tkj8p1o