Skip to content

LSP Servers

OpenCode integrates with your LSP servers.

OpenCode can integrate with Language Server Protocol (LSP) servers to use diagnostics as feedback for the agent.


Built-in

OpenCode comes with several built-in LSP servers for popular languages:

LSP ServerExtensionsRequirements
astro.astroAuto-installs for Astro projects
bash.sh, .bash, .zsh, .kshAuto-installs bash-language-server
clangd.c, .cpp, .cc, .cxx, .c++, .h, .hpp, .hh, .hxx, .h++Auto-installs for C/C++ projects
csharp.cs, .csx.NET SDK installed
clojure-lsp.clj, .cljs, .cljc, .ednclojure-lsp command available
dart.dartdart command available
deno.ts, .tsx, .js, .jsx, .mjsdeno command available (auto-detects deno.json/deno.jsonc)
elixir-ls.ex, .exselixir command available
eslint.ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vueeslint dependency in project
fsharp.fs, .fsi, .fsx, .fsscript.NET SDK installed
gleam.gleamgleam command available
gopls.gogo command available
hls.hs, .lhshaskell-language-server-wrapper command available
jdtls.javaJava SDK (version 21+) installed
julials.jljulia and LanguageServer.jl installed
kotlin-ls.kt, .ktsAuto-installs for Kotlin projects
lua-ls.luaAuto-installs for Lua projects
nixd.nixnixd command available
ocaml-lsp.ml, .mliocamllsp command available
oxlint.ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue, .astro, .svelteoxlint dependency in project
php intelephense.phpAuto-installs for PHP projects
prisma.prismaprisma command available
pyright.py, .pyipyright dependency installed
razor.razor, .cshtml.NET SDK and VS Code C# extension installed
ruby-lsp (rubocop).rb, .rake, .gemspec, .ruruby and gem commands available
rust.rsrust-analyzer command available
sourcekit-lsp.swift, .objc, .objcppswift installed (xcode on macOS)
svelte.svelteAuto-installs for Svelte projects
terraform.tf, .tfvarsAuto-installs from GitHub releases
tinymist.typ, .typcAuto-installs from GitHub releases
typescript.ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .ctstypescript dependency in project
vue.vueAuto-installs for Vue projects
yaml-ls.yaml, .ymlAuto-installs Red Hat yaml-language-server
zls.zig, .zonzig command available

LSP is disabled by default. When enabled, servers start when one of the above file extensions is detected and the requirements are met.


How It Works

When LSP is enabled and opencode opens a file, it:

  1. Checks the file extension against all enabled LSP servers.
  2. Starts the appropriate LSP server if not already running.

Best Practices

LSP can help the agent find and fix issues by providing diagnostics from language servers. This is useful in some projects, but it is not always a net positive.

Language servers can get out of sync, use significant memory, vary by version or project, and slow down agent workflows. In many projects it is better to have the agent run lint, typecheck, or other diagnostic CLI tools directly, so errors are fed back into the agent loop without those tradeoffs. Document those commands in instruction files such as AGENTS.md or skills so the agent knows what to run. Enable LSP when your project benefits from additional language-server feedback.


Configure

You can enable and customize LSP servers through the lsp section in your opencode config.

To enable all built-in LSP servers, set lsp to true.

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"lsp": true
}

Use an object to keep built-ins enabled while configuring overrides or custom servers.

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"lsp": {}
}

Each configured LSP server entry supports the following:

Server entries need command unless they only disable a server.

PropertyTypeDescription
disabledbooleanSet this to true to disable the LSP server
commandstring[]The command to start the LSP server
extensionsstring[]File extensions this LSP server should handle
envobjectEnvironment variables to set when starting server
initializationobjectInitialization options to send to the LSP server

Let’s look at some examples.


Environment variables

Use the env property to set environment variables when starting the LSP server:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"rust": {
"command": ["rust-analyzer"],
"env": {
"RUST_LOG": "debug"
}
}
}
}

Initialization options

Use the initialization property to pass initialization options to the LSP server. These are server-specific settings sent during the LSP initialize request:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"custom-lsp": {
"command": ["custom-lsp-server", "--stdio"],
"extensions": [".custom"],
"initialization": {
"preferences": {
"importModuleSpecifierPreference": "relative"
}
}
}
}
}

Disabling LSP servers

If lsp is omitted, all LSP servers are disabled. To disable all LSP servers after another config enabled them, set lsp to false:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"lsp": false
}

To disable a specific LSP server, set disabled to true:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"typescript": {
"disabled": true
}
}
}

Custom LSP servers

You can add custom LSP servers by specifying the command and file extensions:

opencode.json
{
"$schema": "https://opencode.ai/config.json",
"lsp": {
"custom-lsp": {
"command": ["custom-lsp-server", "--stdio"],
"extensions": [".custom"]
}
}
}

Additional Information

PHP Intelephense

PHP Intelephense offers premium features through a license key. You can provide a license key by placing (only) the key in a text file at:

  • On macOS/Linux: $HOME/intelephense/license.txt
  • On Windows: %USERPROFILE%/intelephense/license.txt

The file should contain only the license key with no additional content.