cclsp
Version:
MCP server for accessing LSP functionality
160 lines (115 loc) • 4.71 kB
Markdown
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
cclsp is an MCP (Model Context Protocol) server that bridges Language Server Protocol (LSP) functionality to MCP tools. It allows MCP clients to access LSP features like "go to definition" and "find references" through a standardized interface.
## Development Commands
```bash
# Install dependencies
bun install
# Development with hot reload
bun run dev
# Build for production
bun run build
# Run the built server
bun run start
# or directly
node dist/index.js
# Run setup wizard to configure LSP servers
cclsp setup
# Quality assurance
bun run lint # Check code style and issues
bun run lint:fix # Auto-fix safe issues
bun run format # Format code with Biome
bun run typecheck # Run TypeScript type checking
bun run test # Run unit tests
bun run test:manual # Run manual MCP client test
# Full pre-publish check
npm run prepublishOnly # build + test + typecheck
```
## Architecture
### Core Components
**MCP Server Layer** (`index.ts`)
- Entry point that implements MCP protocol
- Exposes `find_definition`, `find_references`, and `rename_symbol` tools
- Handles MCP client requests and delegates to LSP layer
- Includes subcommand handling for `cclsp setup`
**LSP Client Layer** (`src/lsp-client.ts`)
- Manages multiple LSP server processes concurrently
- Handles LSP protocol communication (JSON-RPC over stdio)
- Maps file extensions to appropriate language servers
- Maintains process lifecycle and request/response correlation
**Configuration System** (`cclsp.json` or via `CCLSP_CONFIG_PATH`)
- Defines which LSP servers to use for different file extensions
- Supports environment-based config via `CCLSP_CONFIG_PATH` env var
- Interactive setup wizard via `cclsp setup` command
- File scanning with gitignore support for project structure detection
### Data Flow
1. MCP client sends tool request (e.g., `find_definition`)
2. Main server resolves file path and extracts position
3. LSP client determines appropriate language server for file extension
4. If server not running, spawns new LSP server process
5. Sends LSP request to server and correlates response
6. Transforms LSP response back to MCP format
### LSP Server Management
The system spawns separate LSP server processes per configuration. Each server:
- Runs as child process with stdio communication
- Maintains its own initialization state
- Handles multiple concurrent requests
- Gets terminated on process exit
Supported language servers (configurable):
- TypeScript: `typescript-language-server`
- Python: `pylsp`
- Go: `gopls`
## Configuration
The server loads configuration in this order:
1. `CCLSP_CONFIG_PATH` environment variable pointing to config file
2. `cclsp.json` file in working directory
3. Fails if neither is found (no default fallback)
### Interactive Setup
Use `cclsp setup` to configure LSP servers interactively:
- Scans project for file extensions (respects .gitignore)
- Presents pre-configured language server options
- Generates `cclsp.json` configuration file
- Validates server availability before configuration
Each server config requires:
- `extensions`: File extensions to handle (array)
- `command`: Command array to spawn LSP server
- `rootDir`: Working directory for LSP server (optional)
- `restartInterval`: Auto-restart interval in minutes (optional, helps with long-running server stability, minimum 1 minute)
### Example Configuration
```json
{
"servers": [
{
"extensions": ["py"],
"command": ["pylsp"],
"restartInterval": 5
},
{
"extensions": ["ts", "tsx", "js", "jsx"],
"command": ["typescript-language-server", "--stdio"],
"restartInterval": 10
}
]
}
```
## Code Quality & Testing
The project uses Biome for linting and formatting:
- **Linting**: Enabled with recommended rules + custom strictness
- **Formatting**: 2-space indents, single quotes, semicolons always, LF endings
- **TypeScript**: Strict type checking with `--noEmit`
- **Testing**: Bun test framework with unit tests in `src/*.test.ts`
Run quality checks before committing:
```bash
bun run lint:fix && bun run format && bun run typecheck && bun run test
```
## LSP Protocol Details
The implementation handles LSP protocol specifics:
- Content-Length headers for message framing
- JSON-RPC 2.0 message format
- Request/response correlation via ID tracking
- Server initialization handshake
- Proper process cleanup on shutdown
- Preloading of servers for detected file types
- Automatic server restart based on configured intervals
- Manual server restart via MCP tool