language server mcp

Local 2025-08-31 23:15:40 0

TypeScript-based MCP server designed to enhance code editing experiences by providing features such as hover information, code completion, and diagnostics.


A Model Context Protocol (MCP) server providing language support for code editing.

This is a TypeScript-based MCP server designed to enhance code editing experiences by providing features such as hover information, code completion, and diagnostics. It demonstrates core MCP concepts by providing:

  • Language-specific tools for code analysis and manipulation
  • Integration with the Model Context Protocol for seamless communication

Features

Language Support

  • Provides hover information for symbols in code
  • Offers code completion suggestions
  • Reports diagnostic information (errors, warnings)
  • Only tested with typescript, theoretically should support Python. Would love to add additional language servers or be more agnostic if possible.

MCP Integration

  • Implements the MCP protocol for communication with clients
  • Exposes language features as MCP tools

Tools

  • get_hover: Get hover information for a position in a document
  • Takes languageId, filePath, content, line, and character as required parameters
  • get_completions: Get completion suggestions for a position in a document
  • Takes languageId, filePath, content, line, and character as required parameters
  • get_diagnostics: Get diagnostic information for a document
  • Takes languageId, filePath, and content as required parameters

Development

Install dependencies:

npm install

Build the server:

npm run build

For development with auto-rebuild:

npm run watch

Installation

To use with Claude Desktop, add the server config:

On MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json On Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "language-server-mcp": {
      "command": "/path/to/language-server-mcp/build/index.js"
    }
  }
}

Debugging

Since MCP servers communicate over stdio, debugging can be challenging. We recommend using the MCP Inspector, which is available as a package script:

npm run inspector

The Inspector will provide a URL to access debugging tools in your browser.

[
  {
    "description": "Get hover information for a position in a document",
    "inputSchema": {
      "properties": {
        "character": {
          "description": "Zero-based character offset for hover position",
          "type": "number"
        },
        "content": {
          "description": "The current content of the file",
          "type": "string"
        },
        "filePath": {
          "description": "Absolute or relative path to the source file",
          "type": "string"
        },
        "languageId": {
          "description": "The language identifier (e.g., "typescript", "javascript")",
          "type": "string"
        },
        "line": {
          "description": "Zero-based line number for hover position",
          "type": "number"
        },
        "projectRoot": {
          "description": "Important: Root directory of the project for resolving imports and node_modules where the tsconfig.json or jsconfig.json is located",
          "type": "string"
        }
      },
      "required": [
        "languageId",
        "filePath",
        "content",
        "line",
        "character",
        "projectRoot"
      ],
      "type": "object"
    },
    "name": "get_hover"
  },
  {
    "description": "Get completion suggestions for a position in a document",
    "inputSchema": {
      "properties": {
        "character": {
          "description": "Zero-based character offset for completion position",
          "type": "number"
        },
        "content": {
          "description": "The current content of the file",
          "type": "string"
        },
        "filePath": {
          "description": "Absolute or relative path to the source file",
          "type": "string"
        },
        "languageId": {
          "description": "The language identifier (e.g., "typescript", "javascript")",
          "type": "string"
        },
        "line": {
          "description": "Zero-based line number for completion position",
          "type": "number"
        },
        "projectRoot": {
          "description": "Important: Root directory of the project for resolving imports and node_modules where the tsconfig.json or jsconfig.json is located",
          "type": "string"
        }
      },
      "required": [
        "languageId",
        "filePath",
        "content",
        "line",
        "character",
        "projectRoot"
      ],
      "type": "object"
    },
    "name": "get_completions"
  },
  {
    "description": "Get diagnostic information for a document",
    "inputSchema": {
      "properties": {
        "content": {
          "description": "The current content of the file",
          "type": "string"
        },
        "filePath": {
          "description": "Absolute or relative path to the source file",
          "type": "string"
        },
        "languageId": {
          "description": "The language identifier (e.g., "typescript", "javascript")",
          "type": "string"
        },
        "projectRoot": {
          "description": "Important: Root directory of the project for resolving imports and node_modules where the tsconfig.json or jsconfig.json is located",
          "type": "string"
        }
      },
      "required": [
        "languageId",
        "filePath",
        "content",
        "projectRoot"
      ],
      "type": "object"
    },
    "name": "get_diagnostics"
  }
]