English · 简体中文 · Русский · हिन्दी · العربية
[agent-lsp]
[CI Coverage]
[Languages]
[mcp-assert: passing]
[Agent Skills]
[downloads]
[LSP 3.17]
[License]
[Awesome MCP Servers]
[Blackwell Systems]
Code intelligence infrastructure for AI agents. 66 tools, 32 CI-verified languages, 24 agent workflows. Single Go binary.
What is it?
agent-lsp is an MCP server that orchestrates existing LSP servers (gopls, rust-analyzer, jdtls, etc.) into agent-native workflows.
Not an LSP server — it's an orchestration layer that manages language servers and exposes batch operations, speculative editing, and multi-step workflows via MCP tools.
Architecture:
- Language servers (gopls, rust-analyzer, etc.) → provide code intelligence
- agent-lsp (MCP server) → orchestrates workflows, maintains warm runtime
- AI agents → consume via MCP protocol
Why agent-lsp?
Persistent warm runtime
Language servers stay indexed across agent sessions. First session: indexes workspace (~10s for typical projects). Subsequent sessions: instant. No cold-start penalty on each request.
Batch operations
blast_radius → one call returns all exports + all callers (test vs non-test partitioned). Without orchestration: 20+ sequential LSP calls.
Speculative editing
simulate_edit → preview changes in memory, check diagnostic delta, apply or discard. Test edits before touching disk. safe_apply_edit writes only an edit it could verify: if the preview timed out or the server was still indexing, nothing is written.
Workflow orchestration
24 skills that chain LSP operations into complete pipelines:
/lsp-refactor → impact analysis → preview → apply → verify build → run tests
/lsp-safe-edit → preview → diagnostic diff → apply if safe
/lsp-verify → LSP diagnostics → build → test suite
Multi-language, single session
One agent-lsp process routes .go to gopls, .ts to tsserver, .py to pyright. No reconfiguration between projects. Session persists across files and repositories. Workspace-wide queries (find_symbol, get_server_capabilities) ask every running language server, not just the default one. start_lsp can also connect to a language server that is already running (e.g. gopls -listen) and reuse its warm index.
[!TIP]
Token-optimized output: Tool responses encoded in GCF instead of JSON. 30-84% fewer tokens depending on tool (up to 92.7% with session dedup). 100% LLM comprehension on every frontier model, 91.2% on complex code graphs where JSON averages 54.1%. See below for measured savings per tool.
How the pieces fit together: LSP (Language Server Protocol) is how editors get code intelligence: completions, diagnostics, go-to-definition. MCP (Model Context Protocol) is the standard way AI tools like Claude Code discover and call external tools. agent-lsp bridges the two: language server intelligence, accessible to AI agents.
Use it when
- Building agentic code generation systems
- Automating refactors across large codebases
- CI tooling that needs programmatic code intelligence
- Any workflow where sequential LSP calls are too slow or complex
What agents say
We asked AI agents to evaluate agent-lsp across 10 coding tasks (find callers, rename safely, preview edits, detect dead code) and write an honest assessment. Four different models, four independent evaluations, same conclusion:
Claude (Opus 4.6): "I would recommend agent-lsp for any workflow involving refactoring, impact analysis, or safe editing. The standout tools are blast_radius (blast radius in one call, with test/non-test partitioning that would take 5-10 grep commands to replicate), go_to_implementation (type-checked interface satisfaction that grep simply cannot do), and the simulation session workflow (speculative type-checking without touching disk, which has no grep/read equivalent at all)."
Cursor (auto): "I would recommend agent-lsp for heavy refactors and code navigation because the rename, references, implementations, call hierarchy, and simulation tools remove a lot of brittle grep/manual-edit work and make changes safer."
GPT-5.5 (via Codex): "I would recommend agent-lsp for symbol-aware work: references, implementations, rename previews, diagnostics, and large-file structure are materially faster and less error-prone than grep/read loops."
Gemini 2.5 Pro (via Gemini CLI): "I would highly recommend agent-lsp because it provides a level of semantic awareness that standard text-searching tools simply cannot match. The ability to perform high-confidence renames, find interface implementations, and preview the diagnostic impact of edits without writing to disk significantly reduces the risk of introducing regressions."
Tested, not assumed
Every other MCP-LSP implementation lists supported languages in a config file. None of them run the actual language server in CI to verify it works.
agent-lsp CI runs 32 real language servers against real fixture codebases on every push, and all 32 pass end to end: Go, Python, TypeScript, Rust, Java, C, C++, C#, Ruby, PHP, Kotlin, Swift, Scala, Zig, Lua, Elixir, Gleam, Clojure, Dart, Terraform, Nix, Prisma, SQL, MongoDB, MQL, and more. When we say "works with gopls," that's a verified, automated claim, not a hope.
Speculative execution
Simulate changes in memory before writing to disk. No other MCP-LSP implementation has this.
preview_edit previews the diagnostic impact of any edit. You see exactly what breaks before the file is touched. simulate_chain evaluates a sequence of dependent edits (rename a function, update all callers, change the return type) and reports which step first introduces an error.
8 speculative execution tools. See docs/guide/speculative-execution.md for the full workflow.
Interactive refactoring
Some refactorings need answers before the language server can compute them: which struct tags to add and how to name them, which interface to implement, where a declaration should move. gopls v0.24 asks these questions through a new LSP extension (golang/go#76331), which editors show as dialogs. agent-lsp is a client for it built for agents: refactor returns the questions as a typed form (choices, defaults, a searchable list for the interface), the agent answers, and the server computes the edit. agent-lsp captures that edit before it is written, so dry_run previews it.
See refactor in the tool reference.
Token savings
Structured LSP responses use 5-34x fewer tokens than grep/read on the same tasks. On HashiCorp Consul (319K lines), a blast-radius analysis uses 17.7MB via grep vs 841KB via LSP, reducing 5,534 tool calls to 119. Savings scale with codebase size. See docs/guide/token-savings.md for the full experiment across five codebases.
Token-optimized output (GCF)
Tool responses are encoded in GCF (Graph Compact Format) instead of JSON. GCF eliminates field-name repetition, identifier repetition, and per-record structural overhead.
Workspace edits (rename and refactor previews) are always JSON, so they round-trip into apply_edit byte-exact. Grouped/nested responses (callers under a symbol, diagnostics with related info) tabularize too, for ~14% over JSON on that shape (details).
GCF is enabled by default. To revert to JSON:
Benchmark: go run scripts/gcf-benchmark.go. See docs/guide/gcf-integration.md for architecture details.
GCF: gcformat.com · Spec · Go · Python · TypeScript · Playground
Why orchestration matters
AI agents make incorrect code changes because they can't see the full picture: who calls this function, what breaks if I rename it, does the build still pass. Language servers have the answers, but raw LSP tools require 20+ sequential calls and complex orchestration logic.
agent-lsp solves this by encoding correct multi-step operations into single calls and skills. blast_radius does what would take an agent 20+ calls in one. /lsp-refactor chains impact → preview → apply → verify → test without per-prompt orchestration.
Persistent daemon mode
Python and TypeScript projects need minutes of background indexing before find_references works. agent-lsp automatically spawns a persistent daemon broker that survives between sessions, so the workspace stays indexed. First session: daemon starts and indexes (~10s for FastAPI). Subsequent sessions: instant connection to the warm daemon. Auto-exits after 30 minutes of inactivity. Go, Rust, and other fast-indexing languages bypass this entirely (zero overhead).
Phase enforcement
Skills tell agents the correct order of operations. Phase enforcement makes the runtime block violations instead of trusting the agent to follow instructions.
When an agent activates a skill, every tool call is checked against the current phase's permissions. Calling apply_edit during blast-radius analysis doesn't silently proceed; it returns an error with specific recovery guidance, followed by a JSON copy of the same fields:
Phases advance automatically as the agent calls tools from later phases.
No other MCP tool provider enforces workflow ordering at runtime. See docs/guide/phase-enforcement.md.
Concurrency analysis
The inspector includes 4 concurrency checks that work across 25 languages in 4 concurrency families (goroutine, thread, async, actor):
- Unrecovered concurrent entry: goroutines/threads/tasks without recovery
- Unchecked shared state: bare type assertions on sync.Map, ConcurrentHashMap
- Channel never closed: channels/queues created but never closed (goroutine leaks)
- Shared field without sync: fields accessed from concurrent contexts without synchronization
blast_radius annotates symbols with sync_guarded: true when the parent type has a mutex. find_callers with cross_concurrent: true traces call chains through goroutine/thread boundaries. The /lsp-concurrency-audit skill produces a field-level safety report for any type.
Auto-diagnostics
Symbol edit tools (replace_symbol_body, insert_after_symbol, insert_before_symbol, safe_delete_symbol) automatically return errors_after and warnings_after counts. Agents know immediately whether an edit broke something without a separate get_diagnostics call.
safe_apply_edit combines preview + apply in one call: previews speculatively, applies to disk only if net_delta == 0 (no new errors). It also refuses edits it could not verify (a timed-out preview or a server still indexing) and writes only the content it previewed: if the file changed in between, nothing is written. One tool call instead of three.
Works with
See docs/getting-started/mcp-clients.md for copy-paste configs.
Skills
Raw tools get ignored. Skills get used. Each skill encodes the correct tool sequence so workflows actually happen without per-prompt orchestration instructions. Skills are available as AgentSkills slash commands and as MCP prompts via prompts/list / prompts/get for any MCP client.
See docs/guide/skills.md for full descriptions and usage guidance.
Before you change anything
Editing safely
Getting started
Understanding unfamiliar code
After editing
Generating code
Full workflow
Docker
Stdio mode (MCP client spawns the container directly):
HTTP mode (persistent service, remote clients connect over Streamable HTTP):
The server binds 127.0.0.1 by default, so pass --listen-addr 0.0.0.0 inside a container for the port mapping to reach it. Images run as a non-root user (uid 65532) by default. Set AGENT_LSP_TOKEN via environment variable, never --token on the command line. Images are also mirrored to Docker Hub (blackwellsystems/agent-lsp). See DOCKER.md for the full tag list, HTTP mode setup, and security hardening options.
Setup
Step 1: Install agent-lsp
Alternative install methods
macOS / Linux
Windows
All platforms
Step 2: Install language servers
Install the servers for your stack. Common ones:
TypeScript 7 ships without tsserver, which typescript-language-server needs, so install TypeScript 6 (typescript@6) until that changes. A project with TypeScript 6 in its own node_modules works either way.
Full list of supported languages and their CI status in docs/reference/language-support.md.
Step 3: Verify setup
Probes each configured language server and reports capabilities. Fix any failures before proceeding. See language support for install commands and server-specific notes.
Step 4: Configure your AI tool
Detects language servers on your PATH, asks which AI tool you use, writes the correct MCP config, and installs skill awareness rules for your AI provider (CLAUDE.md for Claude Code, .cursor/rules/ for Cursor, .clinerules for Cline, .windsurfrules for Windsurf, GEMINI.md for Gemini CLI, AGENTS.md for Pi and Codex). For CI or scripted use: agent-lsp init --non-interactive.
For Claude Code, choose the project target (1, writes .mcp.json in the current directory) or the user scope (2, all projects: registers the server with claude mcp add --scope user when the claude CLI is installed, otherwise adds it to ~/.claude.json). init only sets the agent-lsp entry; every other server and setting in an existing config file is kept.
For Codex and the ChatGPT desktop app, which share one MCP configuration, choose the user target (11: registers the server with codex mcp add when the codex CLI is installed, otherwise adds an [mcp_servers.agent-lsp] table to $CODEX_HOME/config.toml, default ~/.codex/config.toml) or the project target (12: .codex/config.toml in the current directory, read for trusted projects). The TOML file is edited in place, so your other settings and comments are kept.
For Pi, choose the project (9) or global (10) target. Pi has no built-in MCP support; init writes the shared standard MCP files that the pi-mcp-adapter package reads — project .mcp.json (same file Claude Code uses, so one config serves both) or global ~/.config/mcp/mcp.json. Skill awareness rules go into AGENTS.md (project) or ~/.pi/agent/AGENTS.md (global). Install the adapter once with pi install npm:pi-mcp-adapter.
One-command complete setup
Add --with-skills to also install the embedded skill files (no repo clone needed):
Skills are written to the destination matching the chosen target: only the Pi project target (9) uses the tool-agnostic .agents/skills/ directory (versionable with the repo); the Pi global target (10) uses ~/.pi/agent/skills/; the Claude Code targets (1/2) use ~/.claude/skills/; Cursor (4) uses ~/.cursor/skills/; Gemini CLI (7) uses ~/.config/gemini-cli/skills/; and the Codex user target (11) uses $CODEX_HOME/skills/. Providers without a verified skills directory are skipped with a pointer to skills/install.sh --dest. Re-running overwrites the managed skill files, keeping them in sync with the installed binary. agent-lsp uninstall removes them.
The generated config looks like:
Each arg is language:server-binary (comma-separate server args).
Step 5: Install skills
Or skip the clone entirely: agent-lsp init --with-skills installs the same embedded skills to the destination matching your chosen target.
Skills are prompt files copied into your AI tool's configuration. --copy means the clone can be safely deleted afterward. The script defaults to ~/.claude/skills/; pass --dest for other agents, e.g. --dest ~/.pi/agent/skills for Pi. It also appends a managed skills table to existing instruction files (~/.claude/CLAUDE.md, project AGENTS.md, ~/.pi/agent/AGENTS.md, GEMINI.md).
Skills are also available as MCP prompts: any MCP client can discover them via prompts/list and retrieve full workflow instructions via prompts/get, with no manual installation required. The install.sh path is for AgentSkills-compatible clients (Claude Code slash commands, Pi /skill:name commands).
Step 6: Allow tool permissions (Claude Code)
For Claude Code, add mcp__agent-lsp__* to your permissions allow list so all 66 tools are available without per-tool approval prompts:
Without this, Claude Code will prompt for permission on each tool call. Other MCP clients handle permissions differently; check your client's documentation.
Skills are multi-tool workflows that encode reliable procedures: blast-radius check before edit, speculative preview before write, test run after change. See docs/guide/skills.md for the full list.
Step 7: Start working
Your AI agent calls tools automatically. The first call initializes the workspace:
This is what the agent does, not something you type. Then use any of the 66 tools. The session stays warm; no restart needed when switching files.
What's unique about agent-lsp
Use Cases
- Multi-project sessions: point your AI at
~/code/, work across any project without reconfiguring
- Polyglot development: Go backend + TypeScript frontend + Python scripts in one session
- Large monorepos: one server handles all languages, routes by file extension
- Code migration: refactor across repos with full cross-repo reference tracking
- CI pipelines: validate against real language server behavior
- Niche language stacks: Gleam, Elixir, Prisma, Zig, Clojure, Nix, Dart, Scala, MongoDB, all CI-verified
Multi-Language Support
32 languages CI-verified end to end against real language servers on every CI run. A language that fails to start or answer fails CI rather than being skipped. No other MCP-LSP implementation tests a single language in CI.
Go, Python, TypeScript, Rust, Java, C, C++, C#, Ruby, PHP, Kotlin, Swift, Scala, Zig, Lua, Elixir, Gleam, Clojure, Dart, Terraform, Nix, Prisma, SQL, MongoDB, JavaScript, YAML, JSON, Dockerfile, CSS, HTML, MQL, Luau.
See docs/reference/language-support.md for the full coverage matrix.
Tools
66 tools covering navigation, analysis, refactoring, symbol editing, composite exploration, safe editing, speculative execution, and session lifecycle. All CI-verified.
See docs/reference/tools.md for the full reference with parameters and examples.
Further reading
Documentation
Contributing
Development
Library Usage
The pkg/lsp, pkg/session, and pkg/types packages expose a stable Go API for using agent-lsp's LSP client directly without running the MCP server.
See docs/architecture/architecture.md for the full package API.
License
MIT