Skip to main content
Glama
beixiyo

VSCode LSP MCP Server

by beixiyo

VSCode LSP MCP

๐Ÿ” Overview

VSCode LSP MCP is a Visual Studio Code extension that exposes Language Server Protocol (LSP) features through the Model Context Protocol (MCP).

Extension ID: cjl.lsp-mcp โ€” open Extensions (Ctrl+Shift+X / Cmd+Shift+X) and search for cjl.lsp-mcp to find this plugin precisely.

This allows AI assistants and external tools to utilize VSCode's powerful language intelligence capabilities without direct integration.

TIP

Using Neovim? See vv-mcp.nvim, the sibling implementation that exposes Neovim LSP clients and live editor context through MCP.

vscode-ext demo

๐ŸŒŸ Why This Extension?

Large language models like Claude and Cursor struggle to understand your codebase accurately because:

  • They rely on regex patterns to find symbols, leading to false matches

  • They can't analyze import/export relationships properly

  • They don't understand type hierarchies or inheritance

  • They have limited code navigation capabilities

This extension bridges that gap, providing AI tools with the same code intelligence that VSCode uses internally!

Related MCP server: mcp-pyright

โš™๏ธ Features

  • ๐Ÿ”„ LSP Bridge: Converts LSP features into MCP tools

  • ๐Ÿค– VS Code Copilot integration: Registers the local MCP server directly with VS Code Chat / Copilot

  • ๐Ÿ”Œ Multi-Instance Broker: One stable MCP endpoint discovers and routes requests across all open VS Code windows

  • ๐Ÿง  25 LSP operations covering navigation, diagnostics, document metadata, symbols, call hierarchy, transactional rename, and safe Code Actions

  • โ˜• Java dependency source: Get decompiled Java class source via jdt:// URI (from jdtls), so AI can read library implementations

  • ๐Ÿ“„ Dual output format: JSON for machine processing, Markdown for LLM-friendly reading

๐Ÿ› ๏ธ Exposed MCP Tools

Tool

Description

health

Report the shared broker status

list_instances

List active VS Code windows, workspace roots, and instance IDs

execute_lsp

Execute an LSP operation in an explicitly selected or automatically matched instance

rename_resource

Rename a workspace file or directory in the matching instance

LSP operations

Operation

Description

hover

Get hover information (documentation, type, etc.) at a position

definition

Get the definition location of a symbol

declaration

Get the declaration location of a symbol

type_definition

Get the type definition location of a symbol

implementation

Get the implementation location(s) of a symbol

references

Find all references to a symbol

document_highlight

Find semantic occurrences of a symbol in the current document

document_links

Get navigable document links exposed by the active language extension

inlay_hints

Get inferred type and parameter-name hints for a document range

signature_help

Get signatures and active-parameter information at a call site

document_symbols

Get the symbol outline (tree) of a document

workspace_symbols

Search for symbols across the entire workspace by query

diagnostics

Get diagnostics for one file with optional severity, source, and code filters

workspace_diagnostics

Get filtered diagnostics under a workspace path

code_actions

List editable Code Actions at a position

code_action_preview

Preview one listed Code Action without side effects

fix_document_preview

Preview editable fix-all or quick-fix edits for an entire document

code_action_apply

Apply one previously previewed Code Action transaction

class_file_contents

Get decompiled Java class source via jdt:// URI (from jdtls), to read library/dependency implementations

prepare_rename

Locate and validate a rename candidate

rename_preview

Preview a symbol rename without modifying files

rename_apply

Apply one previously previewed rename transaction

prepare_call_hierarchy

Prepare call hierarchy nodes and return recursive callId values

incoming_calls

Find all callers of a symbol

outgoing_calls

Find all callees (calls made by) a symbol

All operations are invoked through the single execute_lsp MCP tool with a unified input format:

  • operation โ€” which LSP operation to execute

  • uri โ€” file path or URI string (supports both plain paths and file:///jdt:// URIs)

  • line โ€” line number (1-based, matching editor display). Required for position-dependent operations

  • character โ€” character offset (1-based, matching editor display). Required for position-dependent operations

  • newName / renameId โ€” used by the three-stage rename flow

  • actionKind / actionId โ€” filter and continue the Code Action transaction flow

  • query โ€” required only for workspace_symbols

  • symbolKinds, includeDeclaration, includeExternal, pathPattern, severities, sources, codes โ€” optional result filters applied before maxResults

  • startLine, endLine โ€” optional inclusive range for inlay_hints

  • callId โ€” returned by call hierarchy operations for recursive traversal

  • instanceId โ€” optional instance returned by list_instances; takes precedence over automatic path routing

1-based positions: Both input and output use 1-based line/character values, matching what your editor displays. VS Code shows Ln 9, Col 16 โ†’ pass line: 9, character: 16. Output positions can be used directly as input for the next call โ€” no conversion needed.

Multi-instance routing

The extension starts one lightweight internal endpoint per VS Code window and registers it with a shared broker. External clients keep using a single MCP URL. The broker selects an instance in this order:

  1. Exact instanceId, when provided

  2. Longest workspace-root prefix matching the input file path

  3. The only active instance, when no path can identify one

If two windows open the same project, routing is intentionally rejected as ambiguous until the caller passes instanceId. The registry contains no public credentials and stale window records expire automatically.

The first multi-instance release supports local desktop workspaces and file: resources. Remote SSH, WSL, Dev Containers, and virtual workspaces are not yet advertised as supported.

Workspace tools

Tool

Description

rename_resource

Rename a file or directory through VS Code's WorkspaceEdit API. Accepts oldUri, newUri, and optional overwrite parameters. Language extensions can update affected imports and exports as part of the same workspace edit.

For example, the built-in TypeScript provider updates relative imports and barrel exports when a referenced .ts or .tsx file is renamed. The exact companion edits remain language-provider dependent, so inspect diagnostics after applying a resource rename.

๐Ÿ“‹ Configuration

Key

Description

Type

Default

lsp-mcp.enabled

Enable or disable the LSP MCP server.

boolean

true

lsp-mcp.port

Preferred port for the shared MCP broker.

number

9527

lsp-mcp.cors.enabled

Enable CORS for browser-based MCP clients. Keep disabled for native clients.

boolean

false

lsp-mcp.cors.allowOrigins

Allowed origins for CORS. Use * to allow all origins, or provide a comma-separated list of origins (e.g., http://localhost:3000,http://localhost:5173).

string

*

lsp-mcp.cors.withCredentials

Whether to allow credentials (cookies, authorization headers) in CORS requests.

boolean

false

lsp-mcp.cors.exposeHeaders

Headers that browsers are allowed to access. Provide a comma-separated list of headers (e.g., Mcp-Session-Id).

string

Mcp-Session-Id

lsp-mcp.maxResults

Maximum number of items returned for list-type results such as workspace_symbols. Prevents excessive token usage.

number

200

lsp-mcp.outputFormat

Output format for LSP operation results. json for machine-readable JSON, markdown for LLM-friendly Markdown.

string

json

lsp-mcp.dependencyMarkers

Path substrings used to classify dependency results for sorting and includeExternal=false.

string[]

language-specific defaults

๐Ÿ”— Integration with AI Tools

VS Code Copilot

No mcp.json setup is required. After the extension starts, it registers the local LSP MCP server with VS Code through an MCP server definition provider.

Use MCP: List Servers or the chat tools picker in VS Code to enable or manage the LSP MCP Server.

Cursor

Config file: ~/.cursor/mcp.json (e.g. %USERPROFILE%\.cursor\mcp.json on Windows)

{
  "mcpServers": {
    "lsp-mcp": {
      "url": "http://127.0.0.1:9527/mcp"
    }
  }
}

OpenCode

Config file: ~/.config/opencode/opencode.jsonc

{
  "mcp": {
    "lsp-mcp": {
      "type": "remote",
      "url": "http://127.0.0.1:9527/mcp",
      "enabled": true
    }
  }
}

Claude Code

Config file: ~/.claude.json

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "http",
      "url": "http://127.0.0.1:9527/mcp"
    }
  }
}

Gemini | IFlow

Config file: ~/.gemini/settings.json

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "streamable-http",
      "httpUrl": "http://127.0.0.1:9527/mcp"
    }
  }
}

Codex

Config file: ~/.codex/config.toml

[mcp_servers.lsp-mcp]
url = "http://127.0.0.1:9527/mcp"

Roo Code

{
  "mcpServers": {
    "lsp-mcp": {
      "type": "streamable-http",
      "url": "http://127.0.0.1:9527/mcp",
      "disabled": false
    }
  }
}

๐Ÿ’ป Development

  • Clone the repository

  • Run pnpm install

  • Run pnpm run update to generate metadata

  • Press F5 to start debugging

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

โ€“Maintainers
<1hResponse time
โ€“Release cycle
1Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/beixiyo/vsc-lsp-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server