MCP Connector

Enhance Code Suggestions with LSP Integration

MCP server bridging LLMs to any Language Server Protocol backend for hover info, completions, diagnostics, and code actions.

Works with github

Maintainer of this project? Claim this page to edit the listing.


90
Spark score
out of 100
Updated Jul 2025
Version 1.0.0
Models
universal

Add to Favorites

Why it matters

Leverage LLMs to provide intelligent code suggestions, completions, and diagnostics by integrating with Language Server Protocol (LSP) servers. This asset bridges the gap between AI models and code analysis tools for more accurate and context-aware developer assistance.

Outcomes

What it gets done

01

Request hover information and code completions from LLMs.

02

Obtain real-time diagnostics and code actions for improved error handling.

03

Automate code analysis and suggestion generation through LSP integration.

04

Configure and manage LSP servers for various programming languages.

Install

Add it to your toolbox

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/vb-lsp-mcp | bash

Capabilities

Tools your agent gets

get_info_on_location

Get hover information at a specific location in a file

get_completions

Get code completion suggestions at a specific location in a file

get_code_actions

Get code actions for a specific range in a file

open_document

Open a file on the LSP server for analysis

close_document

Close a file on the LSP server

get_diagnostics

Get diagnostic messages (errors, warnings) for open files

start_lsp

Start the LSP server with the specified root directory

restart_lsp_server

Restart the LSP server without restarting the MCP server

set_log_level

Change the server logging verbosity level at runtime

Overview

lsp-mcp MCP Server

lsp-mcp is an MCP server that bridges LLMs to a Language Server Protocol backend. It exposes nine MCP tools plus three resource types covering hover information, code completions, code actions, and diagnostics, so an LLM can query the same data a code editor's language server provides. Use it when an LLM-driven workflow needs accurate, language-server-grade code intelligence such as hover info, completions, or diagnostics for a specific language; skip it if that language's LSP isn't already installed and runnable locally.

What it does

lsp-mcp is an MCP (Model Context Protocol) server that bridges LLMs to a Language Server Protocol (LSP) backend. It works by starting an LSP client that connects to an actual LSP server, exposing that connection as MCP tools an LLM can call, and returning the results in a format the LLM can understand and use. This lets an LLM query the same hover, completion, and diagnostic information a code editor's language server normally provides, instead of guessing at code structure from raw text.

The server also exposes MCP resources - lsp-diagnostics://, lsp-hover://, and lsp-completions:// - as an alternative to the tool-based interface, both discoverable via the MCP resources/list endpoint. Diagnostic resources additionally support the resources/subscribe endpoint, so a client can receive real-time updates when diagnostics change as files are modified. Hover and completion resources are point-in-time queries and do not support subscriptions.

When to use - and when NOT to

Use lsp-mcp when an LLM-driven workflow needs language-server-grade code intelligence - accurate hover information, completion suggestions, diagnostics, or code actions - for a language that already has a working LSP implementation installed locally. It fits editor-like tooling, code review agents, or any agent that needs to reason about a codebase the way an IDE does.

It's not a fit if the target language's LSP server isn't already installed and runnable on the host - lsp-mcp is a bridge to an existing LSP, not an LSP implementation itself. From version 0.2.0 onward, the start_lsp tool must be called explicitly, with the correct root directory, before any LSP functionality works - this matters especially when running the server via npx.

Capabilities

The nine MCP tools are get_info_on_location (hover info at a file position), get_completions (completion suggestions at a position), get_code_actions (code actions for a range), open_document and close_document (manage which files the LSP server is analyzing), get_diagnostics (errors and warnings for one or all open files), start_lsp (start the LSP server with a given root directory), restart_lsp_server (restart the LSP process without restarting the MCP server), and set_log_level (adjust logging verbosity at runtime).

Logging runs at eight severity levels - debug, info, notice, warning, error, critical, alert, and emergency - with detailed error handling and reporting, sent to a color-coded console and as MCP notifications via notifications/message. The default log level is info; for raw MCP traffic during debugging, Claude Code's --mcp-debug flag shows all MCP traffic between Claude and the server. lsp-mcp also supports language-specific extensions that can add custom tools, resource handlers, and prompts, namespaced by language ID; a Haskell extension ships today with a typed-hole exploration prompt.

How to install

Configure it as a stdio MCP server:

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "tritlo/lsp-mcp",
        "<language-id>",
        "<path-to-lsp>",
        "<lsp-args>"
      ]
    }
  }
}

Requires Node.js v16 or later and npm. Running the bundled demo server additionally requires GHC 8.10 or later and Cabal 3.0 or later. To build from source: clone the repository, run npm install, then npm run build. lsp-mcp is released under the MIT License.

Who it's for

Developers building LLM agents or editor integrations that need real language-server accuracy - hover docs, completions, diagnostics, and code actions - rather than text-only code guessing, for languages where an LSP already exists.

Source README

LSP MCP Server

An MCP (Model Context Protocol) server for interacting with LSP (Language Server Protocol) interface.
This server acts as a bridge that allows LLMs to query LSP Hover and Completion providers.

Overview

The MCP Server works by:

  1. Starting an LSP client that connects to a LSP server
  2. Exposing MCP tools that send requests to the LSP server
  3. Returning the results in a format that LLMs can understand and use

This enables LLMs to utilize LSPs for more accurate code suggestions.

Configuration:

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "tritlo/lsp-mcp",
        "<language-id>",
        "<path-to-lsp>",
        "<lsp-args>"
      ]
    }
  }
}

Features

MCP Tools

  • get_info_on_location: Get hover information at a specific location in a file
  • get_completions: Get completion suggestions at a specific location in a file
  • get_code_actions: Get code actions for a specific range in a file
  • open_document: Open a file in the LSP server for analysis
  • close_document: Close a file in the LSP server
  • get_diagnostics: Get diagnostic messages (errors, warnings) for open files
  • start_lsp: Start the LSP server with a specified root directory
  • restart_lsp_server: Restart the LSP server without restarting the MCP server
  • set_log_level: Change the server's logging verbosity level at runtime

MCP Resources

  • lsp-diagnostics:// resources for accessing diagnostic messages with real-time updates via subscriptions
  • lsp-hover:// resources for retrieving hover information at specific file locations
  • lsp-completions:// resources for getting code completion suggestions at specific positions

Additional Features

  • Comprehensive logging system with multiple severity levels
  • Colorized console output for better readability
  • Runtime-configurable log level
  • Detailed error handling and reporting
  • Simple command-line interface

Prerequisites

  • Node.js (v16 or later)
  • npm

For the demo server:

  • GHC (8.10 or later)
  • Cabal (3.0 or later)

Installation

Building the MCP Server

  1. Clone this repository:

    git clone https://github.com/your-username/lsp-mcp.git
    cd lsp-mcp
    
  2. Install dependencies:

    npm install
    
  3. Build the MCP server:

    npm run build
    

Testing

The project includes integration tests for the TypeScript LSP support. These tests verify that the LSP-MCP server correctly handles LSP operations like hover information, completions, diagnostics, and code actions.

Running Tests

To run the TypeScript LSP tests:

npm test

or specifically:

npm run test:typescript

Test Coverage

The tests verify the following functionality:

  • Initializing the TypeScript LSP with a mock project
  • Opening TypeScript files for analysis
  • Getting hover information for functions and types
  • Getting code completion suggestions
  • Getting diagnostic error messages
  • Getting code actions for errors

The test project is located in test/ts-project/ and contains TypeScript files with intentional errors to test diagnostic feedback.

Usage

Run the MCP server by providing the path to the LSP executable and any arguments to pass to the LSP server:

npx tritlo/lsp-mcp <language> /path/to/lsp [lsp-args...]

For example:

npx tritlo/lsp-mcp haskell /usr/bin/haskell-language-server-wrapper lsp

Important: Starting the LSP Server

With version 0.2.0 and later, you must explicitly start the LSP server by calling the start_lsp tool before using any LSP functionality. This ensures proper initialization with the correct root directory, which is especially important when using tools like npx:

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

Logging

The server includes a comprehensive logging system with 8 severity levels:

  • debug: Detailed information for debugging purposes
  • info: General informational messages about system operation
  • notice: Significant operational events
  • warning: Potential issues that might need attention
  • error: Error conditions that affect operation but don't halt the system
  • critical: Critical conditions requiring immediate attention
  • alert: System is in an unstable state
  • emergency: System is unusable

By default, logs are sent to:

  1. Console output with color-coding for better readability
  2. MCP notifications to the client (via the notifications/message method)
Viewing Debug Logs

For detailed debugging, you can:

  1. Use the claude --mcp-debug flag when running Claude to see all MCP traffic between Claude and the server:

    claude --mcp-debug
    
  2. Change the log level at runtime using the set_log_level tool:

    {
      "tool": "set_log_level",
      "arguments": {
        "level": "debug"
      }
    }
    

The default log level is info, which shows moderate operational detail while filtering out verbose debug messages.

API

The server provides the following MCP tools:

get_info_on_location

Gets hover information at a specific location in a file.

Parameters:

  • file_path: Path to the file
  • language_id: The programming language the file is written in (e.g., "haskell")
  • line: Line number
  • column: Column position

Example:

{
  "tool": "get_info_on_location",
  "arguments": {
    "file_path": "/path/to/your/file",
    "language_id": "haskell",
    "line": 3,
    "column": 5
  }
}

get_completions

Gets completion suggestions at a specific location in a file.

Parameters:

  • file_path: Path to the file
  • language_id: The programming language the file is written in (e.g., "haskell")
  • line: Line number
  • column: Column position

Example:

{
  "tool": "get_completions",
  "arguments": {
    "file_path": "/path/to/your/file",
    "language_id": "haskell",
    "line": 3,
    "column": 10
  }
}

get_code_actions

Gets code actions for a specific range in a file.

Parameters:

  • file_path: Path to the file
  • language_id: The programming language the file is written in (e.g., "haskell")
  • start_line: Start line number
  • start_column: Start column position
  • end_line: End line number
  • end_column: End column position

Example:

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

Starts the LSP server with a specified root directory. This must be called before using any other LSP-related tools.

Parameters:

  • root_dir: The root directory for the LSP server (absolute path recommended)

Example:

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

restart_lsp_server

Restarts the LSP server process without restarting the MCP server. This is useful for recovering from LSP server issues or for applying changes to the LSP server configuration.

Parameters:

  • root_dir: (Optional) The root directory for the LSP server. If provided, the server will be initialized with this directory after restart.

Example without root_dir (uses previously set root directory):

{
  "tool": "restart_lsp_server",
  "arguments": {}
}

Example with root_dir:

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

open_document

Opens a file in the LSP server for analysis. This must be called before accessing diagnostics or performing other operations on the file.

Parameters:

  • file_path: Path to the file to open
  • language_id: The programming language the file is written in (e.g., "haskell")

Example:

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

close_document

Closes a file in the LSP server when you're done working with it. This helps manage resources and cleanup.

Parameters:

  • file_path: Path to the file to close

Example:

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

get_diagnostics

Gets diagnostic messages (errors, warnings) for one or all open files.

Parameters:

  • file_path: (Optional) Path to the file to get diagnostics for. If not provided, returns diagnostics for all open files.

Example for a specific file:

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

Example for all open files:

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

set_log_level

Sets the server's logging level to control verbosity of log messages.

Parameters:

  • level: The logging level to set. One of: debug, info, notice, warning, error, critical, alert, emergency.

Example:

{
  "tool": "set_log_level",
  "arguments": {
    "level": "debug"
  }
}

MCP Resources

In addition to tools, the server provides resources for accessing LSP features including diagnostics, hover information, and code completions:

Diagnostic Resources

The server exposes diagnostic information via the lsp-diagnostics:// resource scheme. These resources can be subscribed to for real-time updates when diagnostics change.

Resource URIs:

  • lsp-diagnostics:// - Diagnostics for all open files
  • lsp-diagnostics:///path/to/file - Diagnostics for a specific file

Important: Files must be opened using the open_document tool before diagnostics can be accessed.

Hover Information Resources

The server exposes hover information via the lsp-hover:// resource scheme. This allows you to get information about code elements at specific positions in files.

Resource URI format:

lsp-hover:///path/to/file?line={line}&column={column}&language_id={language_id}

Parameters:

  • line: Line number (1-based)
  • column: Column position (1-based)
  • language_id: The programming language (e.g., "haskell")

Example:

lsp-hover:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell

Code Completion Resources

The server exposes code completion suggestions via the lsp-completions:// resource scheme. This allows you to get completion candidates at specific positions in files.

Resource URI format:

lsp-completions:///path/to/file?line={line}&column={column}&language_id={language_id}

Parameters:

  • line: Line number (1-based)
  • column: Column position (1-based)
  • language_id: The programming language (e.g., "haskell")

Example:

lsp-completions:///home/user/project/src/Main.hs?line=42&column=10&language_id=haskell

Listing Available Resources

To discover available resources, use the MCP resources/list endpoint. The response will include all available resources for currently open files, including:

  • Diagnostics resources for all open files
  • Hover information templates for all open files
  • Code completion templates for all open files

Subscribing to Resource Updates

Diagnostic resources support subscriptions to receive real-time updates when diagnostics change (e.g., when files are modified and new errors or warnings appear). Subscribe to diagnostic resources using the MCP resources/subscribe endpoint.

Note: Hover and completion resources don't support subscriptions as they represent point-in-time queries.

Working with Resources vs. Tools

You can choose between two approaches for accessing LSP features:

  1. Tool-based approach: Use the get_diagnostics, get_info_on_location, and get_completions tools for a simple, direct way to fetch information.
  2. Resource-based approach: Use the lsp-diagnostics://, lsp-hover://, and lsp-completions:// resources for a more RESTful approach.

Both approaches provide the same data in the same format and enforce the same requirement that files must be opened first.

Troubleshooting

  • If the server fails to start, make sure the path to the LSP executable is correct
  • Check the log file (if configured) for detailed error messages

Extensions

The LSP-MCP server supports language-specific extensions that enhance its capabilities for different programming languages. Extensions can provide:

  • Custom LSP-specific tools and functionality
  • Language-specific resource handlers and templates
  • Specialized prompts for language-related tasks
  • Custom subscription handlers for real-time data

Available Extensions

Currently, the following extensions are available:

  • Haskell: Provides specialized prompts for Haskell development, including typed-hole exploration guidance

Using Extensions

Extensions are loaded automatically when you specify a language ID when starting the server:

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

Extension Namespacing

All extension-provided features are namespaced with the language ID. For example, the Haskell extension's typed-hole prompt is available as haskell.typed-hole-use.

Creating New Extensions

To create a new extension:

  1. Create a new TypeScript file in src/extensions/ named after your language (e.g., typescript.ts)

  2. Implement the Extension interface with any of these optional functions:

    • getToolHandlers(): Provide custom tool implementations
    • getToolDefinitions(): Define custom tools in the MCP API
    • getResourceHandlers(): Implement custom resource handlers
    • getSubscriptionHandlers(): Implement custom subscription handlers
    • getUnsubscriptionHandlers(): Implement custom unsubscription handlers
    • getResourceTemplates(): Define custom resource templates
    • getPromptDefinitions(): Define custom prompts for language tasks
    • getPromptHandlers(): Implement custom prompt handlers
  3. Export your implementation functions

The extension system will automatically load your extension when the matching language ID is specified.

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.