CLI agents need more than grep
GitHub Copilot CLI can get surprisingly creative when asked to explain a dependency’s API: it may unzip a JAR, scan .class files, or walk through site-packages and node_modules. Those text-based tactics work for trivial cases but quickly break down on generics, overloads, and compiled code that never existed as readable source.
The Language Server Protocol (LSP) — the same mechanism behind go-to-definition and find-references in editors like VS Code — closes that gap. A new LSP Setup skill from the Awesome Copilot project automates installing and configuring LSP servers for Copilot CLI, giving the agent structured answers instead of approximate text matches. The skill currently covers 14 languages, with a roadmap-ready fallback for anything else.
What the setup workflow does
When triggered, the skill walks through a seven-step sequence rather than assuming anything about your environment.
Step 1: pick the language. The agent uses ask_user with a preset list of choices, which determines everything that follows.
Step 2: detect the OS. It runs uname -s, or checks $env:OS/%OS% on Windows, because install commands differ per platform — e.g. brew install jdtls on macOS versus a manual download on Linux.
Step 3: look up the server. A bundled reference file (references/lsp-servers.md) holds curated per-language install commands, binary names, and ready-made config snippets. The agent reads the matching entry.
Step 4: confirm scope. You choose between user-level config at ~/.copilot/lsp-config.json (applies everywhere) or repository-level at the repo root or .github/lsp.json (project-specific). Repository-level wins when both exist.
Step 5: install. The agent issues the right install command for your OS and target server.
Step 6: write config. Entries go into the chosen file under an lspServers object keyed by a server identifier. The skill enforces rules about the format:
commandmust be on$PATHor an absolute pathargsusually includes"--stdio"for standard I/O transport unless the server (likejdtls) handles that internallyfileExtensionsmaps each leading-dot extension to a known language identifier- existing entries are preserved — the agent merges, never clobbers
Step 7: verify. A quick which <binary> (or where.exe on Windows) confirms the server is reachable, and the agent validates the config is valid JSON.
Semantic answers instead of bytecode forensics
Once an LSP server is wired up, the CLI agent can do more than pattern-match raw text. It can resolve types across dependencies without unpacking archives, jump directly to definitions in third-party libraries even when source isn’t in the repo, locate every reference to a symbol, and pull hover documentation for any function, class, or type.
That shift has practical consequences: fewer tool calls spent on decompilation attempts, fewer wrong turns caused by a misread signature, and more accurate code on the first pass. The agent effectively reasons about your codebase with the same semantic precision your editor already has.
Supported languages and beyond
The skill ships with predefined setups for 14 languages. If your agent hits an unlisted one, it searches for an appropriate LSP server and guides you through adding a manual config entry.
Getting it running
- Download the skill from the Awesome Copilot LSP Setup page.
- Extract the ZIP into
~/.copilot/skills/and restart Copilot CLI (/exit, then relaunchcopilot) to pick up the new skill. - Ask for it in plain language — e.g. “set up LSP for Java” or “enable code intelligence for Python.”
- After the skill finishes, restart once more and run
/lspto check server status before trying go-to-definition on a dependency symbol.
The skill is open source as part of the Awesome Copilot project, built for community contributions and feedback.



