lsp-plus
A search for a name, answered by the language server.
The moment
You ask Claude to rename a function, or to find out who calls it.
Without lsp-plus
Claude searches the text with grep. Grep returns every line that contains the name: imports, calls, the definition, a comment, a namesake somewhere else. It doesn’t say which function each call sits in, so Claude opens the files and reads on to find out.
With lsp-plus
When Claude’s search looks for a name in your code, lsp-plus asks the language server, the engine your editor uses, and attaches its exact answer to the search result: every caller, named by its function. Claude needs no extra step, because the answer is where it was already reading.
Here is the same search, without and with the language server’s answer.
$ git grep -n resolve_color_default src/click/exceptions.py:9:from .globals import resolve_color_default src/click/exceptions.py:48: self.show_color = resolve_color_default() src/click/globals.py:54:def resolve_color_default(color: bool | None = None) -> bool | None: src/click/termui.py:20:from .globals import resolve_color_default src/click/termui.py:99: if _compat.should_strip_ansi(stream, resolve_color_default()): src/click/termui.py:362: color = resolve_color_default(color) src/click/termui.py:581: color = resolve_color_default(color) src/click/utils.py:22:from .globals import resolve_color_default src/click/utils.py:342: elif should_strip_ansi(file, resolve_color_default(color)): `resolve_color_default` per the language server: called from 5 functions in 3 files (code only: strings, comments, docs and namesakes are in the grep above): src/click/exceptions.py: ClickException.__init__ (48) src/click/termui.py: _readline_prompt (99), get_pager_file (362), progressbar (581) src/click/utils.py: echo (342)
Imports, the definition and calls, mixed together. Which function is each call in? The search doesn’t say, so Claude opens the files and reads on.The answer comes with the search: who calls it, each caller named by its function. Claude needs no extra step.
What we measured
On a rename it cut Claude’s steps by a quarter25% fewer steps25% fewer steps
No range in the source
7 per arm
Opus 5.5, 13 Oct 2026, with results as good as without it. An earlier version only told Claude which tool to use instead. That hint was followed 0 times in 450 of 450 of 45
45 notes
Opus 5.5, 13 Oct 2026; the answer itself works.
Every measurement for lsp-plus
The dot is the measured change, the bar around it the 95% range, the upright line no change. Left of the line is cheaper or fewer.
- TypeScript, quick questions: symbol lookups answered inside the searchthe pack against plain Claude Code9.9% cheaper95% range 5.9 to 13.7% cheaper4 per task and condition. Opus 5.5, 15 Oct 2026
- The language server's answer on a rename: requeststhe pack answering symbol greps against the pack25% fewer steps7 per arm. Opus 5.5, 13 Oct 2026
- The language server's answer on a rename: costthe pack answering symbol greps against the pack6.5% cheaper7 per arm. Opus 5.5, 13 Oct 2026
- The language server's answer on a trace: cost eventhe pack answering symbol greps against the pack1% more expensive7 per arm. Opus 5.5, 13 Oct 2026
- Taking lsp-plus out of the pack: no net effect on the wholethe pack without lsp-plus against the pack0.6% cheaper95% range from 7.2% cheaper to 6.7% more expensive4 per condition on multi-step tasks, 6 on small ones. Opus 5.5, 13 Oct 2026
- lsp-plus's first warm-up leaked a file's diagnostics into small tasksthe pack without lsp-plus against the pack (small tasks)4.5% cheaper95% range 1.7 to 7.1% cheaper6 per condition. Opus 5.5, 13 Oct 2026
- The warm-up fixed: small tasks against plainthe pack with the fixed warm-up against plain Claude Code2.2% cheaper95% range from 5.6% cheaper to 1.5% more expensive28 runs of the fixed pack. Opus 5.5, 13 Oct 2026
- The warm-up fixed: small tasks against the pack without lsp-plusthe pack with the fixed warm-up against the pack without lsp-plus1.7% more expensive95% range from 1.5% cheaper to 4.9% more expensive28 runs of the fixed pack. Opus 5.5, 13 Oct 2026
- The rename with the fixed pack, against plainthe pack with the fixed warm-up against plain Claude Code19% cheaper95% range 4 to 32% cheaper28 runs of the fixed pack. Opus 5.5, 13 Oct 2026
- A note telling Claude which language-server call answers its grepnotes acted on, of notes shown0 of 4545 notes. Opus 5.5, 13 Oct 2026
- blast (callers after a signature change), taken outthe ideas without blast against with it3.7% more expensive95% range from 2.0% cheaper to 11.0% more expensive4 per task and arm. Opus 5.5, 15 Oct 2026
Tried for lsp-plus and dropped: The grep hint, blast: callers after a signature change.
Where it doesn’t help
Over the whole pack it shows no saving we could measure0.6% cheaper, 95% range from 7.2% cheaper to 6.7% more expensive0.6% cheaper
95% range from 7.2% cheaper to 6.7% more expensive
4 per condition on multi-step tasks, 6 on small ones
Opus 5.5, 13 Oct 2026: it speaks only when a search looks for a name, and many jobs never do. Each language needs its server, and a server takes memory while the session runs.
Turn it on or off
Run /lsp-plus:setup once in your project to install the servers. /mods lsp-plus off turns it off. Every option is in the README; the code is in lsp-plus/.