Mods

lsp-plus

A search for a name, answered by the language server.

It comes with the pack and is on from the start.

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.

Show
$ 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.

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/.